자바스크립트에서 '~~' 는 무엇인가요 ?

도키도키·2023년 5월 16일

우리는 코딩테스트를 준비하며 다른사람의 풀이를 볼때 간혹 인간 미니파이들을 보곤 합니다(칭찬입니다 🙇)
그분들께서 자주 사용하는 패턴이기에 한번쯤 눈여겨보셨으리라 생각합니다.

예를들어 프로그래머스에서

💡 num1, num2 2개의 숫자를 받아 num1을 num2로 나눠 몫을 return하는 함수를 만들어주세용

라는 문제가 있다고 가정해봅시다

function solution(num1, num2) {
    const answer = Math.floor(num1 / num2);
    return answer;
}

라는 답이 대체로 많을텐데 다른 사람의 풀이를 보니

function solution(num1, num2) {
    const answer = ~~(num1 / num2);
    return answer;
}

👀 알수없는 특수 문자를 쓰고있습니다

여기서 ~~ 연산자는 비트 not 연산자를 두번 사용한것입니다. 그

잠깐만, 일단 ~ 비트 NOT 연산자가 무슨 일을 하는데 ?

📖 MDN : 해당 연산자는 피연산자의 부호를 32비트 정수로 변화한다음 모든 비트를 반전시킵니다.

설명만으로는 무슨소리를 하는지 저도 모르겠습니다. 😓

어떻게 변환되는지 따라가보며 이해해봅시다 !

~ 연산자 작동 순서

  1. 5는 이진수로 00000000000000000000000000000101입니다.
  2. 비트 반전을 적용하면 11111111111111111111111111111010가 됩니다. (0, 1 로만 이루어져 있기에)
  3. 이진수 11111111111111111111111111111010는 10진수로 6입니다.
💡 **1. 피연산자를 2진수로 변환 2. 비트 반전 3. 다시 10진수로 변환**

그래도 이해가 안된다면 이것만 기억합시다

💡 어떤 수 `x`에 대해 NOT 비트 연산을 하면 `-(x + 1)`의 결과를 도출합니다. 예를 들면 `~-5`는 `4`로 계산됩니다. (2의 보수에 따라 반전)

그렇다면 소수점에 대해 ~ 연산하면 어떻게 되는데 ?

console.log(~5.5)
console.log(~5.9321389210839201)
console.log(~5.13219378901)

// -6, -6, -6

→ 모두 동일하게 소수가 버려지고 -(x + 1) 의 결과를 도출합니다.

사실 이해가 안되어도 상관없습니다. 일반적으로 우리가 개발하며 비트연산할 일은 많지 않을테지만요

그래도 ~ 연산자라는것이 어떤건지 한번쯤 들어보는것은 좋다고 생각합니다.

다시 본론으로 돌아가 우리가 코테 문제에서 사용된 ~~ 연속된 비트 NOT 연산자는 무엇을 의미하는지 알아봅시다 !

쉽게 말하면 피연산자를 -(x + 1) 로 변경시키고 한번더 -(변경된 값 + 1) 로 변경할겁니다.

그렇다면 소수는 버려지고 다시 반전 시키므로 원래의 값의 정수부분만 남을겁니다.

console.log(~5.13219378901) // -6

console.log(~-6) // 5

한줄요약 : ~~ 연산자는

💡 Math.floor 와 같은 기능을 한다.
즉, 해당 소수를 정수로 반환하는 기능을 한다

0개의 댓글