비트 연산자
아래의 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 |