일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- c언어
- 데이터베이스
- 문법
- 백준
- SQL 문법
- 코딩테스트
- 토이프로젝트
- 스프링
- 파이썬
- 기초
- 오라클
- 프로그래밍
- 빅데이터
- 엘라스틱서치
- 스프링부트
- 위클리챌린지
- 자바
- 필기
- 모의해킹
- 문제풀이
- SQL
- 해킹실습
- 알고리즘
- 스파크
- 데이터프로그래밍
- SQL 정리
- 프로그래머스
- 리눅스마스터 2급 2차
- 이클립스
- MySQL
- Today
- Total
개발일기
[C언어 활용] 비트 연산자 이해하기 본문
<예제 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h>
int main()
{
unsigned char ch = 255, mask = 0x7F;
printf("%d\n", ch);
printf("%d\n", ch & mask);
printf("%d\n", (char) ~ch);
printf("%d\n", ch ^ ch);
printf("%d\n", ch >> 1);
printf("%d\n", mask << 1);
return 0;
}
|
cs |
비트 연산은 약간 특별한 경우에 사용하기 때문에 C 언어에 대해 좀 더 실력이 붙은 다음에 봐도 늦지 않습니다.
비트 연산은 2진수를 연산하기 위한 것으로써, 비트 연산자를 이해하기 위해서는 우선 2진수라는 것이 무엇인지 알아야 합니다. 보통 우리들이 사용하는 0~9까지의 수를 10진수라고 부릅니다.
10개의 숫자를 사용하기 때문에 10진수라고 부르면 2진수는 2개의 숫자(0, 1)를 사용합니다.
십진수 3을 2진수로 변경해서 표현하면 11이 됩니다.
십진수는 한자리 늘어 날때마다 1, 10, 100, 1000, ... 그럼 2진수는 어떻게 늘어날까요?
1, 2, 4, 8, ... 이런 식으로 2의 승수로 늘어납니다.
C언어 프로그래밍에서는 특별히 16진수를 표현할 때 0x를 사용합니다.
예제에서 0x7F는 16진수를 표현하는 것입니다.
그럼 지금부터 위 예제 소스에 대해서 설명해드리겠습니다.
5번째 줄 : 문자형 변수 ch에 255를 대입합니다. 이 값을 2진수로 표현하자면 11111111이 됩니다.
7번째 줄 : ch의 값을 출력합니다.
8번째 줄 : ch & mask의 값은 논리곱으로써, 다음과 같이 연산합니다.
비트곱 연산은 두 개의 값이 모두 1인 경우 1이 되며, 두 개 중 하나라도 0이면 그 값은 0이 됩니다.
1 1 1 1 1 1 1 1 ← ch의 변수 2진 표현 값
&0 1 1 1 1 1 1 1 ← mask 변수의 2진 표현 값
--------------------------------------------
0 1 1 1 1 1 1 1 ← 10진수로 127
9번째 줄 : ~ch의 값은 모든 비트의 값을 반전하는 역할을 합니다.
10번째 줄 : ch ^ ch 의 값은 배타적 비트합의 값으로써, 둘 중의 하나만 참인 경우에만 참이 됩니다.
11번째 줄 : ch >> 1 의 값은 모든 비트를 한 자리씩 오른쪽으로 옮기는 역할을 합니다. 컴퓨터는 내부적으로 덧셈과 뺄셈만을 할 수 있기 때문에 나눗셈은 바로 이 연산자를 사용하여 구현합니다.
쉬프트 연산자 ( >> ) 는 모든 비트를 오른쪽으로 한 자리씩 옮기는 역할을 합니다.
쉬프트 연산자 ( << ) 는 모든 비트를 왼쪽으로 한 자리씩 옮기는 역할을 하며 곱셈은 바로 이 연산자를 사용하여 구현합니다.
'프로그래밍 이론 > C' 카테고리의 다른 글
[C언어 활용] 메시지 암호화 및 복호화 (0) | 2021.07.31 |
---|---|
[C언어 리눅스 프로젝트] TCP/IP 소켓을 이용한 악성코드 원리 배우기 (1) | 2021.01.31 |
[C언어 활용] 숫자야구 만들기 (0) | 2021.01.30 |
[C언어 활용] TCP/IP 서버 주소 및 포트 설정하기 (0) | 2021.01.25 |
[C프로그래밍 활용] TCP/IP 초기화 하기 (0) | 2021.01.24 |