記錄

비트연산자(Bitwise Operator) 본문

FRONTEND STUDY/JavaScript

비트연산자(Bitwise Operator)

prts 2022. 10. 15. 11:49

 

비트 연산(bitwise operation)은 한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산이다. 비트 연산은 정수나 정수로 변환 가능한 타입만 가능하며, 실수나 포인터 등은 비트 연산을 할 수 없다.

비트는 바이트 단위보다 더 작은 단위이며, 컴퓨터에서 사용할 수 있는 최소 단위이다. 우리가 흔히 사용하는 10진수가 아닌 2진수를 사용하며, 0과 1을 나타낸다.

 

비트연산자의 종류

 

비트연산자 설명
& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)
<< 지정한 수만큼 비트를 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

(표, 설명 출처: http://www.tcpschool.com/javascript/js_operator_bitwise )

 

 

AND 연산자( & )

 

-첫 번째 피연산자의 각 비트는 두 번째 피연산자의 해당 비트(첫 번째 비트 와 첫 번째 비트, 두 번째 비트 와 두 번째 비트 등등)와 쌍을 이루고, 각 연산자가 각 비트의 쌍에 적용됨

- 대응되는 두 비트가 모두 1일 때만 1을 반환하고, 다른 경우는 모두 0을 반환 ( = 곱연산)

1 0 0 1 0 1 1 1
& & & & & & & &
1 0 1 1 1 0 0 1
1 0 0 1 0 0 0 1
//AND &

let a=6;
let b=13;
console.log(a&b); //4

/*
a     0 1 1 0
b     1 1 0 1
      0 1 0 0  (이진수 100 = 십진수 4)
*/

 

OR 연산자 ( | )

 

-대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환( = 합연산)

1 0 1 1 0 1 1 0
| | | | | | | |
1 0 0 1 1 0 0 0
1 0 1 1 1 1 1 0
let a=8;
let b=11;
console.log(a|b); //11

/*
a	1 0 0 0
b	1 0 1 1
	1 0 1 1  = 11
*/

 

XOR 연산자(^)

 

-배타적(Exclusive) OR 연산

-비교하는 값이 서로 다르면 1을 반환하고, 서로 같으면 0을 반환

-비트연산자 > 이진 형식으로 두 정수 값을 평가하기 때문에 비교하는 숫자를 이진수로 변경하고 각 자리수를 비교함

십진수 이진수 자리수 비교( ^ )
123 1 1 1 1 0 1 1
100 1 1 0 0 1 0 0
31 0 0 1 1 1 1 1
let a=123;
let b=100;
console.log(a^b); //31

console.log(a.toString(2)) //1111011
console.log(b.toString(2)) //1100100 
//같으면 0, 다르면 1        > 0011111
console.log(parseInt(11111, 2)) //31

let c=12;
let d=12;
console.log(c^d); //0

이 연산자를 활용해서 이런 문제 풀이가 가능하다.

 

NOT  연산자( ~ )

-부정 논리 연산자로, 피연산자가 하나 ( = 한 값의 비트를 모두 반전시킴. ex) ~1 = 0 )

-해당 비트가 1이면 0을 반환하고, 0이면 1을 반환

0 0 0 1 0 1 1 1
~ ~ ~ ~ ~ ~ ~ ~
1 1 1 0 1 0 0 0
let b3 = ~4;
console.log('~4: ',b3); //-5
//0000 0100
//1111 1011
//1bit 자리 즉 가장 왼쪽에 있는 것이 부호 비트인데
//1이면 음수, 0이면 양수이다

코드 예시 출처

 

시프트 연산자( <<, >> )

 

-비트 이동 연산자라고도 하며, 지정한 수만큼 모든 비트를 전부 좌우로 이동시킴

-a >> b 로 표현되며a의 비트 열을 b칸씩 오른쪽으로 이동시킨다는 의미

-연산 시 밀려나는 비트는 버려지며, 새로 들어오는 비트는 항상 0

-정수형 변수에만 사용이 가능

 

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

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

// <<
A<<B  //A를 왼쪽으로 B만큼 이동
100<<1 //200
100<<2 //400
100<<4 //800

//A<<B 연산 결과 값은 A*(2의 B제곱)한 결과값(결과 값의 범위 내에서)

// >>
A>>B  //A를 오른쪽으로 B만큼 이동
100>>1 //50
100>>2 //25
100>>4 //12

//A>>B 연산 결과 값은 A*(1/(2의 B제곱))한 결과값
//정수 타입이기 때문에 12.5 > 12

var x = 15, y = 8, z = 15;
document.write((x << 1) + "<br>"); // 곱하기 2와 같으므로 15 * 2 = 30
document.write((y >> 1) + "<br>"); // 나누기 2와 같으므로 8 / 2 = 4

간혹 이진수를 사용한 문제에서 사용될 때가 있어서 정리해 본 내용이다. 자주는 아니더라도 필요할 때 사용하면 코드도 간결해지고 연산 속도 자체도 빠르게 나와서 유용할 것 같다.

'FRONTEND STUDY > JavaScript' 카테고리의 다른 글

Cookie, LocalStorage, SessionStorage  (0) 2022.11.20
정규표현식 Regex  (0) 2022.11.13
JavaScript 함수/조건문/반복문  (0) 2022.10.30
JavaScript 메서드 - map, reduce, filter  (0) 2022.10.22
JavaScript 기본 문법  (0) 2022.10.09
Comments