본문으로 바로가기

비트 연산자

category JavaScript 2020. 12. 19. 02:27

비트 연산자

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

아래의 3개는 번역이 덜 되어있는데

>> , << 는

지정한 비트 수만큼 전부 왼쪽이나 오른쪽으로 이동시키는데 이때 부호를 유지한다

>>>는

위와 같이 지정한 비트 수만큼 오른쪽으로 이동시키는데 이때 부호를 신경쓰지않고 새롭게 나타나는 비트들은 0으로 채운다

비트 연산은 기본적으로 2진수로 바꿔서 연산한 뒤 다시 10진수로 반환한다

&

console.log(7^9);

7과 9를 2진수로 바꾼 뒤에 &연산을 해주는데 대응되는 비트들이 같으면 1 그렇지 않으면 0을 반환한다

// 0111
//  &
// 1001
// 0001

값은 1

|

대응되는 비트 중 하나라도 1이면 1 그렇지 않으면 0

console.log(7|9);
// 0111
//  |
// 1001    
// 1111

값은 15

^

대응되는 비트가 서로 일치하지 않으면 1을 반환 일치하면 0

console.log(7^9);
// 0111
//  ^
// 1001
// 1110

값은 14

알고리즘을 풀다가 비트 연산자를 이용해서 푸는 것을 봤는데 매우 유용해 보여서 알아보게 된 이유가 된 연산자다

같은 값으로 연산을 두번하게 되면 원래 값이 나온다는 것을 응용해서 숫자 3개중 중복되지 않는 수를 찾아야 하는 상황에서 쓸 수 있다

console.log(7^9^7);
// 1001
//  ^
// 0111
// ====
// 1110
//  ^
// 1001
// ====
// 1001

같이 사용해서 쓸 수 있다

>>

비트들을 오른쪽으로 밀어버린다

console.log(7>>1);
//0111
// >>
//0011

결과는3

2로 나눈 몫과 같다

<<

비트들을 왼쪽으로 밀어버린다

console.log(7<<1);
//0111
// >>
//1110

결과는 14

2로 곱한 것과 같다

<<와 >>는 미는 칸 수가 늘어날 수록 2의 제곱수 만큼 나누고 곱하는 것과 같다 (1칸 밀면 2로, 2칸 밀면 4로, 3칸 밀면 8로, ..)

~

모든 비트들을 반전시킨다 0은 1로 1은 0으로

console.log(~7);
//0111
// ~
//1000

결과 값은 -8이다

왜 8이 아니지? 라고 생각해서 찾아봤는데 비트로 표시되는 모든 수엔 1bit자리에 0이면 양수, 1이면 음수로 표시하는 비트가 있다

이 과정에서 안 것은 그냥 2진수가 아닌 32비트로 변환해서 연산한다는 것

7은 사실 0000 0000 0000 0000 0000 0000 0000 0111로 변환되어서 연산된다

console.log(~7);
// 0000 0000 0000 0000 0000 0000 0000 0111
// ~
// 1111 1111 1111 1111 1111 1111 1111 1000

가 -8이라고 한다

아마 첫번째 비트가 0인지 1인지에 따라서 10진수로 계산하는 방법이 다른듯 싶다..

실제로 1000 0000 0000 0000 0000 0000 0000 0000 가 -2147483648라고 하니까

'JavaScript' 카테고리의 다른 글

논리 연산자  (0) 2020.12.24
if, else 줄이기  (2) 2020.12.23
history  (0) 2020.12.12
slice() vs substring()  (0) 2020.12.03
API 사용하기  (0) 2020.11.22