• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

비트연산자질문입니다

21.07.05 10:56 작성 조회수 478

0

#include<stdio.h>

int main(void)

{

   printf("AND:%8X\n",0x9&0xA);

   printf("OR : %8X\n", 0x9 | 0xA);

   printf(:XOR : %08X\n", 0x9 ^ 0xA);

   printf("NOT : &08X\n", -0x9): 

}

출력값이 

AND : 00000008

OR : 0000000B

XOR : 00000003

NOT : FFFFFF6 

로 나오는데, 이유를 알 수 있을까요 ? 비트연산자 논리연산이 이해가 안가네요 ㅠㅠ 

답변 1

답변을 작성해보세요.

0

안소님의 프로필

안소

2021.07.06

두 가지에 대한 이해가 필요할 것 같습니다.

1️⃣ 첫 번째로 16진수!

비트는 이진수이죠. 0과 1의 값을 가지니까요. 반면 16진수는 0부터 15 (10~15는 ABCDEF 라고 표현하죠) 의 값을 가집니다.

따라서 16진수 한 자리로 이진수 4 자리를 표현할 수 있는거에요! 

예를 들어 11은 10진수로 11 / 16진수로 B / 2진수로 1011 입니다. 즉, B 라는 16진수 하나가 1011  4자리의 비트를 표현할 수 있다고 이해하시면 됩니다.

따라서 0000000B 이 8 자리의 16진수 값은 비트로 표현하면 0000 0000 0000 0000 0000 0000 0000 1011 이런 32자리의 비트와도 같습니다.

2️⃣ 비트 연산에 대한 이해

강의에서 비트 연산자에 대해서 배우셨을 겁니다. 즉, 두 비트끼리 연산을 하는거에요! 

AND, OR 등등 비트 연산자들에 대해선 강의에서 들으셨으리라 생각하고 설명을 생략하겠습니다.

0x9 | 0xA 의 결과가 0000000B 가 되는 이유는

16진수인 0x9 는(앞에 00000 은 생략되고 9 만 나타낸 것입니다.) 32자리 비트로 표현하면 0000 0000 0000 0000 0000 0000 0000 1001 이 됩니다. 

16진수인 0xA 를 32자리 비트로 표현하면 0000 0000 0000 0000 0000 0000 0000 1010 이 됩니다.

0x9 : 0000 0000 0000 0000 0000 0000 0000 1001

0xA : 0000 0000 0000 0000 0000 0000 0000 1010

이렇게 32자리 비트가 각각 있는데요. 자리가 같은 하나의 비트끼리!! 비트 연산을 각각 진행하시면 됩니다.

1011 과 1010 의 OR 연산은 1011 이 되죠? 앞에 많은 00000... 끼리는 어차피 OR 연산해도 0 일것이구요.

따라서 0x9 | 0xA 의 답은 0000 0000 0000 0000 0000 0000 0000 1011 입니다. 이는 16진수로 표현하면 0x0000000B 입니다

나머지도 이런식으로 이해해보시면 됩니다~!