비트연산자

hello__0·2022년 8월 1일
0

비트연산자

  • 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.
  • 또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용합니다.
비트 연산자설명
~비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)
&대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
|대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
<<지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)
>>지정한 수만큼 비트들을 전부 오른쪽으로 이동시킴. (right shift 연산)

비트 NOT 연산자 ( ~ )

주어진 비트가 1이면 0으로, 0이면 1로 반전시켜 1의 보수로 만들어 준다.

보수
보수는 보충을 해주는 수를 의미합니다.
현재의 숫자에서 자릿수가 1단계 올라갈 수 있는 수가 몇인지를 구하면 된다.

10진수
1의 보수 : 1+9=10 -> 1의 보수 = 9
3의 보수 : 3+7=10 -> 3의 보수 = 7

2진수
1₂의 보수 : 1₂+ 1₂=10₂ -> 1₂의 보수 = 1₂
10₂의 보수 : 1001₂+0111₂=11110₂ -> 1001₂의 보수 = 0111₂

const x = 7;

console.log(~7); // output : -8

비트 AND 연산자 ( & )

두개의 피연산자 비트가 모두 1일 때만 1을 반환합니다.

const x = 7;
const y = 10;

console.log(7&10); // output : 2

비트 OR 연산자 ( | )

비트 OR 연산자는 두 개의 피연산자 비트 중 하나라도 1일 때는 1을 반환합니다.

const x = 7;
const y = 10;

console.log(7|10); // output : 15

비트 XOR 연산자 ( ^ )

XOR 연산이란 배타적 논리합(exclusive OR)이라고도 불리며, 두 개의 피연산자 중 하나만이 1일 때 1을 반환합니다.
두개의 피연산자 중 두 수가 같다면 0을 반환합니다.
이러한 성질을 이용하면 비트 NOT 연산자는 모든 비트를 반전시키지만, 비트 XOR 연산자는 지정한 비트만을 반전시킬 수 있습니다.

const x = 7; // 00000000 00000000 00000000 00000111
const y = 10; // 00000000 00000000 00000000 00001010  

console.log(7^10); // 00000000 00000000 00000000 00001101 : 13  

비트 시프트 연산자( << / >> )

비트 시프트(shift) 연산자는 비트 이동 연산자라고도 하며, 지정한 수만큼 모든 비트를 전부 좌우로 이동시킵니다.

왼쪽 시프트 연산자(<<, left shift)

문법

피연산자 << 이동할 비트수

이렇게 왼쪽으로 모든 비트를 이동시키면, 맨 왼쪽의 비트는 지정된 수만큼 자동으로 버려지게 됩니다.

그리고 왼쪽으로 이동된 수만큼 비게 되는 오른쪽 비트에는 자동으로 0이 채워집니다.

int x = -1;        // 11111111 11111111 11111111 11111111

int y = x<<2;      // 왼쪽으로 2비트만큼 이동시킴.

int z = x<<3;      // 왼쪽으로 3비트만큼 이동시킴.  

console.log(x); // 11111111 11111111 11111111 11111100 : -4

console.log(x); // 11111111 11111111 11111111 11111000 : -8  

위의 예제에서 -1을 2비트만큼 왼쪽으로 이동한 결괏값은 -4가 되며, 3비트만큼 왼쪽으로 이동한 결괏값은 -8이 됩니다.

즉, 왼쪽 시프트 연산으로 1비트씩 모든 비트를 이동시킬 때마다 피연산자의 값은 두 배씩 증가하게 되는 걸 알 수 있습니다.


왼쪽 시프트 연산자(>>, right shift)

문법

피연산자 >> 이동할 비트수

이렇게 오른쪽으로 모든 비트를 이동시키면 맨 오른쪽의 비트는 지정된 수만큼 자동으로 버려지게 됩니다.

그리고 오른쪽으로 이동된 수만큼 비게 되는 왼쪽 비트에는 자동으로 0이 채워집니다.
이때 오른쪽 시프트 연산은 왼쪽 시프트 연산과는 달리 시스템마다 약간의 차이가 발생하게 됩니다.

일부 시스템에서는 최상위 부호 비트(MSB)까지 시프트 연산의 대상이 되기도 하지만, 일부 시스템에서는 최상위 부호 비트는 시프트 연산의 대상에서 제외하기도 하기 때문입니다.

따라서 최상위 부호 비트가 중요한 의미를 가지는 부호있는 정수에 대해서는 가급적 시프트 연산을 하지 않는 것이 좋습니다.

연산의 결괏값은 시스템에 따라 차이가 발생합니다.

const x = -8;        // 11111111 11111111 11111111 11111000

const y = x>>2;      // 오른쪽으로 2비트만큼 이동시킴.

const z = x>>3;      // 오른쪽으로 3비트만큼 이동시킴.  

console.log(y); // 11111111 11111111 11111111 11111110 : -2

console.log(z);   // 11111111 11111111 11111111 11111111 : -1

위의 예제에서 -8을 2비트만큼 오른쪽으로 이동한 결괏값은 -2가 되며, 3비트만큼 오른쪽으로 이동한 결괏값은 -1이 됩니다.

즉, 오른쪽 시프트 연산으로 1비트씩 모든 비트를 이동시킬 때마다 피연산자의 값은 두 배씩 감소하게 되는 걸 알 수 있습니다.

참고 : http://www.tcpschool.com/c/c_refer_bitCalculation
보수 : https://coding-factory.tistory.com/653

profile
자라나라 나무나무

0개의 댓글