본문 바로가기
자바스크립트(JavaScript)/프로그래머스 문제풀기

[JavaScript] 틸트(tilt) 연산자(~), (~~)

by yerica 2024. 12. 16.

틸트 연산자 (~)

틸트 연산자는 비트 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');
}

 

  • fruits.indexOf('banana')가 1을 반환(존재하므로 1번째 위치).
    ~1 = -2 → 조건식은 true.
  • 반대로, 값이 없으면 indexOf는 -1을 반환.
    ~-1 = 0 → 조건식은 false.
2. 2의 보수 계산
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}​