소소하지만 확실한 정보

WOODIE·2025년 1월 4일
0

#Record

목록 보기
8/24
post-thumbnail

연산자에 대한 TMI

console.log(1 + 1);
console.log(1 + "1");

+ 연산자는 문자열 연결 연산과 덧셈 연산의 두 가지 역할을 수행합니다.
피연산자 중 하나가 문자열이면, 다른 피연산자를 문자열로 변환하여 문자열 연결을 수행합니다. 따라서 첫 번째 값은 2 를 반환하고, 두 번째 값은 11 을 반환합니다.


console.log(1 - 2);
console.log(1 - "2");

- 연산자는 숫자의 뺄셈 연산만 지원합니다.
피연산자 중 하나가 문자열일지라도, 문자열을 숫자로 변환하여 연산합니다. 따라서 첫 번째 값과 두 번째 값 모두 -1 로 반환됩니다.

* 연산자와 / , % 연산자도 숫자 우선으로 처리한다!




두 수의 나숫셈 문제를 풀다가

const solution = (num1, num2) => num1 / num2 << 0

이런 풀이를 발견, 너무너무 깔끔하고 좋은 것인데 <<0 이건 무슨 뜻일까?

  1. 비트 시프트 연산자(<<)란?
    비트 시프트 연산자는 이진수 비트들을 왼쪽 또는 오른쪽으로 이동시키는 연산자
  • x << n : x 를 왼쪽으로 n 비트 이동
  • x >> n : x 를 오른쪽으로 n 비트 이동

하지만 << 0 은 실제로 비트 이동을 하지 않고, 숫자를 강제로 정수로 변환하는 효과를 가진다! 그래서 7 / 2 와 같은 문제 풀이를 할 때에, 답이 3.5로 나오지 않고 정수값으로 반환하기 위해 << 0 을 붙여준 것.


  1. << 0Math.floor()parseInt()
표현식결과설명
 5 / 2   2.5   나누기 결과 
 5 / 2 <<0 2 비트 시프트로 소수점 제거(내림) 
 Math.floor(5 / 2) 2 내림(소수점을 버리지만, 음수일 때 더 작은 값으로 내림) 
 paeseInt(5 / 2) 2 소수점 이하 버림(소수점을 잘라낸다) 
 ~~(5 / 2)2  ~~ (이중NOT)으로 정수 변환 

  1. 주의할 점!!
    (1) 음수의 경우 Math.floor() 와 다를 수 있음

    예를 들어 7 / 3 << 0Math.floor(-7 / 3) 을 비교해 보면, 전자는 -2 가 출력되는 반면 후자는 -3 이 출력된다. Math.floor() 는 더 작은 숫자로 내리고, << 0 는 소수점 자체를 버려버리는 메서드이기 때문!

    (2) << 0 은 32비트 정수로 변환하므로 매우 큰 숫자에서는 오작동할 수 있다!

    32비트 정수 : 0 부터 4,294,967,295 또는 -2,147,483,648 부터 2,147,483,647까지!!
    2의 31승 빼기 1 인데 메르센 소수에 해당한대요 그게뭔데 아무튼 32비트 컴퓨터에서 정수로 저장할 수 있는 최대값이라고 합니다.


오늘의 TMI : 유튜브는 처음 설계될 때 조회수를 32비트 정수로 다뤘었는데, 싸이의 강남스타일 뮤비 조회수가 메르센 소수를 넘어가는 바람에 64비트 정수로 업그레이드해야 했다고 함,,

0개의 댓글