c언어 기초 _ 비트 연산자
* 비트 연산자
10진수를 2진수 형태로 각 비트 별로 연산을 진행
- & 비트 AND 연산 : 대응되는 비트가 모두 1이면 1을 반환 => 2진수로 변환 후 진행
0101 1000 = 88
&
0100 1100 = 76
--------------
0100 1000 = 72
- | 비트 OR 연산 : 대응되는 비트 중 하나라도 1이면 1을 반환
0101 1000 = 88
|
0100 1100 = 76
--------------
0101 1100 = 92
- ^ 비트 XOR 연산 : 대응되는 비트가 서로 다르면 1을 반환
0101 1000 = 88
^
0100 1100 = 76
--------------
0001 0100 = 20
- ~ 비트 NOT 연산 : 비트가 0이면 1, 1이면 0으로 반전
- << Left Shift 연산 : 비트들을 모두 지정 수만큼 왼쪽으로 이동
0100 1100 = 76
<<1
--------------
1001 1000 = 152
- >> Right Shift 연산 : 비트들을 모두 지정 수 만틈 오른쪽으로 이동
0101 1000 = 88
>>2
--------------
0001 0110 = 22
---------------------------------------------------------------------------
ex)
char num1 = 78, num2 = 37, num3 = 18;
char num4 = 4, num5 = 106;
printf("%d\n", num1 | num3);
printf("%d\n", num5 & num2);
printf("%d\n", num4 ^ num3);
printf("%d\n", (unsigned char)~num4); // unsigned char = 부호 비트를 사용하지 않음
=>
94
32
22
251
* 진법
N진법에서 사용하는 수는 N개, 수의 범위는 0 ~ (N-1)
2진법 : 0 1
8진법 : 0 1 2 3 4 5 6 7
10진법 : 0 1 2 3 4 5 6 7 8 9
16진법 : 0 1 2 3 4 5 6 7 8 9 A B C D E F
* bit
=> 컴퓨터에서 사용하는 가장 작은 단위
* byte
=> 프로그래밍에서 사용하는 기본 단위
8bit = 1byte
2진수 => 10진수
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
>> 1이 켜져있는 곳을 다 더함
ex)
0000 0011 = 2 + 1 = 3
0001 1000 = 16 + 8 = 24
10진수 => 2진수
>> 0이 되도록 각 자릿수에 맞게 빼준 후 빼준 자릿수에 1을 켜줌
ex)
87 = 87 - 64 = 23 - 16 = 7 - 4 = 3 - 2 = 1 - 1 = 0
64 16 4 2 1 = 0101 0111
2진수 => 8진수
구별을 위해 8진수 앞에는 0을 붙임
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
ex)
01 010 111 = 1 + 2 + 7 = 127 =0127
16진수
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
구별을 위해 16진수 앞에는 0x를 붙임
ex)
0101 0111 = ( 4 + 1 ) + ( 4 + 2 + 1 ) = 5 + 7 = 57 = 0x57
0011 11110 = ( 2 + 1 ) + ( 8 + 4 + 2 ) = 3 + 14 = 3E = 0x3E
1111 1111 = ( 8 + 4 + 2 + 1 ) + ( 8 + 4 + 2 + 1 ) = 15 + 15 = FF = 0xFF
* 부호 비트
=> 0000 0000 에서 첫 번째 0은 부호 비트로 사용
=> 켜져 있을 때 (1) : 음수
꺼져 있을 때 (0) : 양수
ex)
0000 1010 = 10
1000 1010 = -10
* 보수
=> 보충해주는 수를 말함
- 1의 보수
모든 비트를 1로 만들어주는 수 (단점, 0이 양수 0과 음수 0으로 나누어짐)
ex)
0000 1010 = 10
1111 0101 = -10 (1의 보수)
- 2의 보수
1의 보수에서 1을 더한 수 ( 0이 양수와 음수로 나누어지므로 1번 더 더하여 사용)
0000 1010 = 10
1111 0101 = -10 (1의보수)
1111 0110 = -10 (2의보수)
ex)
-59
0011 1011
1100 0100 (1의 보수)
1100 0101 (2의 보수)
-7
0000 0111
1111 1000 (1의 보수)
1111 1001 (2의 보수)
>> 보수를 보면 몇인지 알 수가 없기 때문에 다시 보수를 진행하여 확인
1100 0110 = ? (but 첫 번째 부호 비트가 켜져 있으므로 음수임을 알 수 있음)
0011 1001 = 57
1100 0110 = -57 임을 확인할 수 있음