틸트 연산자 (~)
틸트 연산자는 비트 NOT 연산자다.
이 연산자는 비트 단위로 피연산자의 모든 비트를 반전( 0 → 1, 1 → 0) 시킨다.
이를 정수에서 사용한다면 정수를 32비트로 나타냈을 때의 부호를 뒤집고, 2의 보수 표현 규칙에 따라 결과를 반환한다.
이를 수학 공식으로 표현하면 ** ~x ** 는 ** x = - ( x + 1 ) ** 와 같다.
이를 통해 다음과 같이 활용할 수 있다.
1. 배열에서 값 존재 여부 확인const fruits = ['apple', 'banana', 'orange']; if (~fruits.indexOf('banana')) { console.log('banana exists'); // 출력: banana exists } else { console.log('banana does not exist'); }
2. 2의 보수 계산
- fruits.indexOf('banana')가 1을 반환(존재하므로 1번째 위치).
~1 = -2 → 조건식은 true.- 반대로, 값이 없으면 indexOf는 -1을 반환.
~-1 = 0 → 조건식은 false.
const x = 5; const complement = ~x; // -6 console.log(complement);
** 틸트연산자는 연산속도도 크게 차이 없고, 초보자에겐 직관적이지 않을 수 있어 자주 사용되진 않는다.
+) 결과값을 2진수로 변환해서 보는 방법
ㄴ 백업
더블틸트( ~~ ) 연산자
앞서 틸트 연산자(~) 는 비트연산이고, 소수점 아래 비트는 버리는 성질을 가지게 된다.
즉, 몫을 구할 때 Math.trunc 같은 것을 대체할 수 있고, 무엇보다 기계어와 가까운 비트 연산이기 때문에 연산 속도 자체는 빠르다.
1. 더블틸트 연산자는 Math.floor()와 동등하게 쓰인다.
const num = '1234.5678'; console.log(~~num); // 1234
2. undefined 또는 null을 0으로 변환할 때 사용할 수 있다.
const arr = [1,1,1,2,2,3,3,3,3] const obj1 = {} arr.forEach(v=>{ if(obj1[v]) obj1[v]+=1 else obj1[v]=1 }) //obj1 {1: 3, 2: 2, 3: 4} // 더블틸트 연산자를 썼을 경우 다음과 같이 줄여서 사용 가능하다. arr.forEach(v=>obj2[v]= ~~obj2[v]+1) //obj2 {1: 3, 2: 2, 3: 4}
'자바스크립트(JavaScript) > 프로그래머스 문제풀기' 카테고리의 다른 글
[programmers - js] 세균증식 / 시프트 연산자(<<) (0) | 2024.12.16 |
---|---|
[programmers - js] 양꼬치 / Math.floor, 더블틸트연산자 (0) | 2024.12.16 |
[백업] tilde(~)과 double tilde(~~)연산자 (0) | 2024.12.16 |
[programmers - js] 배열의 평균값 (0) | 2024.12.16 |
[programmers - js] 짝수 더하기 (0) | 2024.12.16 |