본문 바로가기

코린이

Day6 본문

C언어/C언어 기본문법

Day6

winsome99 2022. 11. 4. 03:03
반응형

 

오늘은 간단하게 비트 연산자에 대해서 공부를 해보았다.

 

비트 연산자

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이 나온다


(이상하다 간단하게 한다 하고 생각보다 많이 나와서 놀람...)

 

 

 

반응형

'C언어 > C언어 기본문법' 카테고리의 다른 글

Day8  (0) 2022.11.07
Day7  (0) 2022.11.04
Day5  (0) 2022.11.04
Day4  (0) 2022.11.03
Day3  (0) 2022.11.02
Comments