비트연산자
10진수를 2진수 형태로 각 비트별로 연산을 진행
& (비트 AND 연산) : 대응되는 비트가 모두 1이면 1을 반환
ex)
88 0101 1000
&
76 0100 1100
--------------
72 0100 1000
| (비트 OR 연산) : 대응되는 비트 중 하나라도 1이면 1을 반환
ex)
88 0101 1000
|
76 0100 1100
--------------
92 0101 1100
^ (비트 XOR 연산) : 대응되는 비트가 서로 다르면 1을 반환
ex)
88 0101 1000
^
76 0100 1100
--------------
20 0001 0100
~ (비트 NOT 연산) : 비트가 0이면 1, 1이면 0으로 반전
<<(Left Shift) : 비트들을 모두 지정 수만큼 왼쪽으로 이동
ex)
76 0100 1100
<< 1
--------------
152 1001 1000
>>(Right Shift) : 비트들을 모두 지정 수만큼 오른쪽으로 이동
ex)
88 0101 1000
>> 2
--------------
22 0001 0110
+ 10진수, 2진수, 8진수, 16진수
10진수 | 2진수 | 8진수 | 16진수 |
10 | 0000 1010 | 12 -> 012 | A -> 0xA |
35 | 0010 0011 | 43 -> 043 | 23 -> 0x23 |
46 | 0010 1110 | 56 -> 056 | 2E -> 0x2E |
31 | 0001 1111 | 37 -> 037 | 1F -> 0x1F |
62 | 0011 1110 | 76 -> 076 | 3E -> 0x3E |
255 | 1111 1111 | 377 -> 0377 | FF -> 0xFF |
변환 방법
10진수 -> 2진수
ex) 46 = 32 + 8 + 4 + 2 = 0010 1110
2진수 -> 8진수 : 3개씩 끊는다.
ex) 0010 1110 -> 00 101 110 -> 56 -> 056 ( 10진수와 비교하여 8진수임을 나타내기 위해서 앞에 0을 써준다.)
2진수 -> 16진수 : 4개씩 끊는다.
ex) 0010 1110 -> 0010 1110 -> 2E -> 0x2E (10진수와 비교하여 16진수임을 나타내기 위해서 앞에 0x를 써준다.)
+c.f.) 16진수: 0123456789A BCDEF
+c.f.) 32에서 1을 빼는 방법으로 계산하면 더 편리
예제 1)
printf("비트 AND 연산 결과 : %d\n", 88 & 76);
printf("비트 OR 연산 결과 : %d\n", 88 | 76);
printf("비트 XOR 연산 결과 : %d\n", 88 ^ 76);
printf("Left Shift 연산 결과 : %d\n", 76 << 1);
printf("Right Shift 연산 결과 : %d\n", 88 >> 2);
/*출력결과
비트 AND 연산 결과 : 72
비트 OR 연산 결과 : 92
비트 XOR 연산 결과 : 20
Left Shift 연산 결과 : 152
Right Shift 연산 결과 : 22
*/
예제 2)
char num1 = 78, num2 = 37, num3 = 18;
char num4 = 4, num5 = 106;
/*
num1 78 0100 1110
num2 37 0010 0101
num3 18 0001 0010
num4 4 0000 0100
num5 106 0110 1010
*/
printf("%d\n", num1 | num3);
printf("%d\n", num5 & num2);
printf("%d\n", num4 ^ num3);
printf("%d\n", ~num4);
printf("%d\n", num4 << 3);
printf("%d\n", num3 >> 1);
/*출력결과
94
32
22
-5
32
9
*/
-> c.f.) 1111 1111에서 4의 부분만 꺼진 상태이므로 255 - 4 를 통해서 계산할 수 있음
부호비트
부호비트가 꺼져있으면 양수
부호비트가 켜져있으면 음수
#방법1 :
10 0000 1010
-10 1000 1010
-> 문제 발생 : 10 + -10이 0이 되지 않고 -20이 나옴 ; 기각
#방법2 : 1의 보수 사용 (보수 : 보충해주는 수)
1의 보수 : 각 비트를 1로 만들어 주기 위해 필요한 수
ex) 1의 보수를 이용해 음수를 2진수로 변환
-10
0000 1010
1111 0101 -> 1의 보수 = -10
ex) 1의 보수를 이용해 음수의 2진수 형태를 보고 10진수로 변환
1110 1100 = -?
0001 0011 = 19
1111 1111 = -0 -> 문제 발생
#방법3 : 2의 보수 사용
2의 보수 : 1의 보수에 1을 더한 수
-10
0000 1010
1111 0101 -> 1의 보수
1111 0110 -> 2의 보수 = -10
- 더 쉽게 변환하는 법
: 우선 양수라고 생각했을 때 2진수로 나타낸 후, 오른쪽에서 시작해서 0이면 넘어가고, 1이면 그 비트를 제외한 앞부분을 모두 반전시킴
ex) -59 표현하기
59 0011 1011
-59 1100 0101
ex2) -100 표현하기
100 0110 0100
-100 1001 1100
'C > C언어 기초' 카테고리의 다른 글
08. 반복문, for() 문, break, continue (0) | 2022.08.13 |
---|---|
07. 조건문 if~else, 삼항연산자, sizeof 연산자 (0) | 2022.08.09 |
04. 상수, 형변환 (0) | 2022.08.02 |
03. 변수, 자료형, 입력 (0) | 2022.08.02 |
02. 서식지정자 (0) | 2022.08.02 |