우리는 코딩테스트를 준비하며 다른사람의 풀이를 볼때 간혹 인간 미니파이들을 보곤 합니다(칭찬입니다 🙇)
그분들께서 자주 사용하는 패턴이기에 한번쯤 눈여겨보셨으리라 생각합니다.
예를들어 프로그래머스에서
💡 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비트 정수로 변화한다음 모든 비트를 반전시킵니다.
설명만으로는 무슨소리를 하는지 저도 모르겠습니다. 😓
어떻게 변환되는지 따라가보며 이해해봅시다 !
00000000000000000000000000000101입니다.11111111111111111111111111111010가 됩니다. (0, 1 로만 이루어져 있기에)11111111111111111111111111111010는 10진수로 6입니다.그래도 이해가 안된다면 이것만 기억합시다
💡 어떤 수 `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와 같은 기능을 한다.
즉, 해당 소수를 정수로 반환하는 기능을 한다