C/C언어 기초

06. 비트연산자, 부호비트, 1의보수, 2의보수

eun_coco 2022. 8. 9. 15:37


  비트연산자  

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