| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- programmers
- TypeScript
- react
- 제로베이스 프론트엔드 스쿨
- wai-aria
- 정규표현식
- 비트연산자
- html&css
- 웹접근성
- JavaScript
- leetcode
- react-query
- 카드뉴스
- 디자인
- 프로그래머스
- 알고리즘
- Today
- Total
記錄
비트연산자(Bitwise Operator) 본문

비트 연산(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 |