Progremming Study/C언어

c언어 기초 _ 비트 연산자

dana's 2022. 6. 17. 15:49
728x90

* 비트 연산자

 

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 임을 확인할 수 있음

 

 

728x90