728x90
<목차>
0. TL;DR
1. ~ (Bitwise NOT 연산자)
2. ~~ (Double Bitwise NOT 연산자)
3. >>> (부호 없는 오른쪽 시프트 연산자)
코딩 테스트 문제를 풀고 다른 사람의 풀이는 어떨지 궁금해서 봤다. 위와 같이 처음 보는 연산자를 사용해서 문제를 풀었길래 신기해서 ~~ 연산자에 대해서 공부해봤다.
0. TL;DR
- ~: 비트 단위 NOT 연산을 수행하여 비트를 반전시킴
- ~~: 숫자의 소수 부분을 제거하고, 정수 부분만 반환함
- ~와 ~~ 연산자는 비트 연산과 관련된 특정 작업이나 최적화된 정수 변환 등에 유용하게 사용될 수 있음
- >>>: 피연산자의 이진 표현을 오른쪽으로 시프트하며, 부호에 상관없이 빈 자리를 0으로 채움
- 부호 없는 정수로 처리하여 음수도 양수처럼 시프트함
- 주로 부호를 무시하고 오른쪽 시프트 연산을 해야 할 때 사용
자바스크립트에서 ~와 ~~ 연산자는 각각 비트 연산자와 수학적 연산자로, 다음과 같이 사용된다.
1. ~ (Bitwise NOT 연산자)
비트 단위로 NOT 연산을 수행. 즉, 숫자의 모든 비트를 반전시킨다.
- 작동 방식: 32비트 정수로 변환한 후, 각 비트를 반전시킨다.
- 용도: 비트 단위 연산이나 특정 상황에서 빠르게 -1을 곱한 결과를 얻고 싶을 때 사용할 수 있다.
예제
let num = 5; // 00000000000000000000000000000101 (이진법)
let result = ~num; // 11111111111111111111111111111010 (이진법), 십진수로는 -6임
console.log(result); // -6
[Reference]
- [MDN] ~ (Bitwise NOT) 연산자 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT
2. ~~ (Double Bitwise NOT 연산자)
: 숫자의 소수 부분을 버리고 정수 부분만 반환하는 역할
- 작동 방식: 첫 번째 ~가 숫자의 비트를 반전시키고, 두 번째 ~가 다시 비트를 반전시켜 원래 숫자의 정수 부분을 반환한다.
- 용도: 소수점을 버리고 정수 부분만 필요할 때 사용한다. Math.floor()나 parseInt()보다 빠르게 동작할 수 있다.
예제
let num = 5.67;
let result = ~~num; // 결과는 5 (정수 부분만 남음)
console.log(result); // 5
[Reference]
- [MDN] ~~ (Double Bitwise NOT) 연산자 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT#double_bitwise_not
3. >>> (부호 없는 오른쪽 시프트 연산자)
피연산자의 이진 표현을 오른쪽으로 시프트한다.
왼쪽에 생긴 빈 자리는 0으로 채우고, 오른쪽으로 밀려난 비트는 버린다.
- 작동 방식
- 피연산자를 32비트 부호 없는 정수로 변환한다.
- 오른쪽으로 지정된 비트 수만큼 시프트한다.
- 왼쪽의 빈 자리는 0으로 채운다.
- 주요 특징
- 부호 비트는 영향을 받지 않기 때문에, 항상 0으로 채워진다.
- 음수를 포함한 모든 숫자를 양수로 취급한다.
예제
let num = -8; // 32비트 표현: 11111111111111111111111111111000
let result = num >>> 2; // 00111111111111111111111111111110 (결과는 1073741822)
console.log(result); // 1073741822
용도
- 부호 없는 연산: 음수를 양수로 변환한 후, 시프트 연산을 할 때 사용
- 빠른 나눗셈: 2의 거듭제곱으로 나누는 경우에 유용
let num = 16;
let result = num >>> 1; // num을 2로 나눈 결과 (8)
console.log(result); // 8
[Reference]
- [MDN] >>> (Unsigned Right Shift) 연산자 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift
728x90
'[Front-end] 개발자 공부' 카테고리의 다른 글
[개발 공부 86일차] 함수형 코딩 | 방어적 복사 (2) | 2024.08.19 |
---|---|
[개발 공부 85일차] 함수형 코딩 | 더 좋은 액션 만들기 (0) | 2024.08.05 |
[개발 공부 83일차] 함수형 코딩 | 액션과 계산, 데이터의 차이 알기 (0) | 2024.07.21 |
[개발 공부 81일차] React 공식 문서 | Custom Hook으로 로직 재사용하는 법 (0) | 2024.07.12 |
[개발 공부 80일차] React 공식 문서 | Escape Hatches (4) (0) | 2024.07.11 |