코린이
Day6 본문
오늘은 간단하게 비트 연산자에 대해서 공부를 해보았다.
비트 연산자
10진수를 2진수 형태로 각 비트별로 연산을 진행해 준다.
우선 2진수는 표시할 수 있는 법이 0,1로 2개만 표현이 가능하다.
0~1까지 2개의 숫자를 세다가 더 이상 표현 수가 없을 때 높은 자릿수를 1씩 증가시켜 다음 수를 표현한다
&(비트 AND 연산)
|
0101 1000 = 88
& 0100 1100 = 76 ----------------- 0100 1000 = 72 |
두 개의 2진수들은 각각 88과 72의 값을 가지고 있다. 여기서 and 연산을 하면 두 비트의 값이 전부 1이면 1을 반환한다. 그러므로 두 값은 0100 1000을 반환하여 72의 값이 나왔다.
|(비트 OR 연산)
|
0101 1000 = 88
| 0100 1100 = 76 ----------------- 0101 1100 = 92 |
OR 연산자는 대응되는 비트 중 하나라도 1이면 1을 반환한다.
^(비트 XOR 연산)
|
~(비트 NOT 연산)
|
<<(Left Shift 연산)
|
>>(Right Shift 연산)
|
0101 1000 = 88
^ 0100 1100 = 76 ------------------ 0001 0100 = 20 |
0101 1000 = 88
~ ---------------- 1010 0111 = -89 |
0100 1100 = 76
<<1 ---------------- 1001 1000 = 152 |
0101 1000 = 76
>>2 ---------------- 0001 0110 = 22 |
^(비트 XOR 연산): 대응되는 비트가 서로 다르면 1을 반환
~(비트 NOT 연산): 비트가 0이면 1, 1이면 0으로 반전
<<(Left Shift 연산): 비트들을 모두 지정 수 만큼 왼쪽으로 이동
>>(Right Shift 연산): 비트들을 모두 지정 수 만큼 오른쪽으로 이동
진수 표현법
|
10진수
|
2진수
|
8진수
|
16진수
|
10
|
10
|
0000 1010
|
012
|
0xA
|
35
|
35
|
0010 0011
|
043
|
0x23
|
46
|
46
|
0010 1110
|
056
|
0x2E
|
31
|
31
|
0001 1111
|
037
|
0x1F
|
62
|
62
|
0011 1110
|
076
|
0x3E
|
255
|
255
|
1111 1111
|
0377
|
0xFF
|
소스코드
#include<stdio.h>
int main() {
printf("비트 AND 연산 결과: %d\n",88 & 76);
printf("비트 OR 연산 결과: %d\n",88 | 76);
printf("비트 NOR 연산 결과: %d\n",88 ^ 76);
printf("Left Shift 연산 결과: %d\n", 76 << 1);
printf("Right Shift 연산 결과: %d\n", 88 >> 2);
return 0;
}
소스코드
#include<stdio.h>
int main() {
char num1 = 78, num2 = 37, num3 = 18, num4 = 4, num5 = 106;
num1 = 0100 1110
num2 = 0010 0101
num3 = 0001 0010
num4 = 0000 0100
num5 = 0110 1010
printf("%d\n",num1 | num3); //0101 1110 94
//num1 = 0100 1110
//num3 = 0001 0010
printf("%d\n",num5 & num2); //0010 0000 32
//num5 = 0110 1010
//num2 = 0010 0101
printf("%d\n",num4 ^ num3); //0001 0110 22
//num4 = 0000 0100
//num3 = 0001 0010
printf("%d\n",~num4); //2의 보수 사용: 1111 1011 -5
//num4 = 0000 0100
printf("%d\n",num4 << 3); // 0010 0000 32
//num4 = 0000 0100
printf("%d\n",num3 >> 1);//0000 1001 9
//num3 = 0001 0010
return 0;
}
※참고※
2의 보수를 이용한 2진수
2진수
-59 1100 0101
-7 1111 1001
-100 1001 1100
보충 설명
음수를 표현하는 방법
0000 0000
↑
맨 앞의 0은 부호비트로 꺼져있으면 양수(+)값을 켜져있으면 음수값(-)을 나타낸다
보수: 보충해주는 수
1의 보수: 각 비트를 모두 1로 만들어주는 수
0000 1010 = 10
1111 0101 -> 1의 보수 = -10
1111 0110 -> 2의 보수 = -10
1100 0110 = -57
0011 1001 = 57
2의 보수: 1의 보수에 1을 더해준 수
-10구하고싶으면 부호를 제외한 10을 먼저 구하고 1의 보수를 구해준다 그 다음 1의 보수에 1을 더해주면 2의 보수로 -10이 나온다
(이상하다 간단하게 한다 하고 생각보다 많이 나와서 놀람...)