본문 바로가기

Programming Language/Javascript,Typescript

틸트(~) 연산자와 ~~ 알아보기

현재 목표는 프로그래머스의 0레벨 100문제를 전부 풀어보는것인데

현재 100개중 45개를 푼 상태이다. 그래서 곧 고지가 눈 앞인데...

다른사람의 풀이를 보다가 ~~ 연산을 사용해서 몫을 구하는 사람들이 있어 

틸트(~)가 뭔지 알아보다가 적는 포스팅이다.

이진수와 Not 연산

나는 인간이니까 십진수가 거의 디폴트로 박혀있는 상태이지만,

컴퓨터는 이진법(0,1)로 연산한다는걸 마음속에 저장하면서 프로그래밍을 배워야 한다.

 

JS에서 ! 를 붙이면 NOT이 된다는건 아는데, 그럼 물결(틸트)는 뭐냐?

이진수로 바꾸고 NOT을 붙인다는 소리인데... 사실 잘 와닫지 않는다.

 

예를들어 1을 틸트연산자 ~1을 출력하면 -2가 출력되는데, 이 원리를 간단히 알아보자면

 

1을 이진수로 바꾸면 00000001(2) 인데, 이걸 NOT 연산자로 치환하면 

11111110 정도가 되겠다. 이걸 십진수로 바꾸면 -2 가 되는데  결국 틸트 연산자는

-(n+1)의 결과를 출력한다. 

그런데 이걸 써먹는곳은 크게 두가지가 있는데

 

1. JS메소드 줄이기

 

검색 관련한 메소드에서, 예를들어 IndexOf() 같은 메소드는 

해당 인덱스가 존재하면 인덱스를 뱉어내고, 없으면 -1을 반환하는 메소드인데

이 틸트 연산자를 사용하여 (-1을 틸트 연산자를 사용하면 0이 된다!)
조건문 작성시 조금 간편하게 사용할수 있다는 정도.

근데 사실 연산속도도 크게 차이 없고, 사실상 사용한 케이스를 거의 보지 못했다.

 

2. ~~를 사용하면 '버림'이 된다!

 

원본값을 반환하게 되는데, 앞서 말한것처럼 이 ~는 비트 연산이고, 
소수점 아래 비트는 버리는 성질을 가지게 된다. 즉 몫을 구할때 

Math.trunc같은걸 대체할 수 있고, 무엇보다 기계어와 가까운 비트 연산이기때문에

연산 속도 자체가 빠르다는 것!

 

사실 이 두번째 목적이 99% 틸트 연산자의 사용목적(정확히말하면 더블틸트) 아닐까 싶다.

 

--------

 

결론

 

몫 구하고싶을때 ~~ 를 사용해보자.