어느 날 ~를 잔뜩 넣은 휘황찬란한 코드를 보았고, 머리로는 ~의 쓰임새를 알고 있으나 마음으로..이해가 되지 않아 정리를 결심하게 되었다.
~를 뭐라고 부르는 지 몰라 구글링 하는 데 꽤나 애를 먹었고, 도저히 찾을 수가 없어
파이썬 물결표 -> 물결표 영어로 -> tilde라고 하는구나 아하 -> 파이썬 tilde
라는 사고를 거쳐서야 정보를 얻을 수 있었다.
~ 는 bitwise operator(비트 연산자)다.
bitwise operator는 말 그대로 bit by bit 연산을 시행한다는 뜻, 즉 2진수를 연산하는 방식이며 하드웨어 세계관에서 가장 기본적인 연산자다. 컴퓨터는 2진수로 구성되기에 모든 프로그래밍 언어는 비트 연산자를 내장 함수로 포함하고 있다. => 그래서 내가 하고 싶은 말은 파이썬 고유 언어가 아닌 공통 컴퓨터 언어에 쓰이는 연산자라는 것
비트 연산자
Symbol | Operation |
~ | Bitwise negation |
& | Bitwise and |
| | Bitwise or |
^ | Bitwise exclusive or |
~^ , ^~ | Bitwise exclusive nor |
비트 연산자는 대강 요런거다. 우리가 흔히 파이썬에서 조건문 쓸 때 사용하는 &와 같은 것들이 있다.
비트 연산자는 왜 사용해야하는가?
-> 빠른 속도
bit는 최소정보단위로 다른 추상화된 정보들과는 달리 재현의 과정을 거치지 않고 즉시 해석되어 의미를 전달하기때문에 빠를 수 밖에 없다.
~ (tilde)
:논리를 부정하는 연산자다. 이진법을 반대로 뒤집어 0은 1로, 1은 0으로 반환한다.
앞에서는 0은 1로, 1은 0으로 반환한다하였는데, 왜 ~1은 -2가 되었을까?
-> 파이썬에서는 2의 보수를 표현해주기 때문이다.
python document 에서는 ~를
The bitwise inversion of x is defined as -(x+1)
라고 표현하고 있다.
~(0b11110000) = -(0b11110000 + 1) = -0b11110001
그렇기 때문에,
11110000 -> 00001111 변환이 필요하다면 1의 보수로 표현하기 위해서 ~가 아닌 xor(^)을 통한 변환이 필요하다.
*2의 보수?
-> 컴퓨터가 음수를 저장하기 위해 사용하는 방법 중 하나
-> 비트 연산자 NOT (~) 에서 1을 더해주는 것
앞에서 말한 것처럼 True는 숫자로 1이지만, 2의 보수 표현식을 쓰기때문에 -2가 되었다.
42에서 ~42는
비트에서, 0b10 1010 -> -0b10 1011 와 같은 변화를 보인다.
숫자에선, 42 -> -43 와 같은 변화를 보인다.
*bin 함수는 비트를 알 수 있는 함수이다.
Tilde Operation | Bit Transformation | Integer Result |
~0 | ~0000 0000 -> 1111 1111 | -1 |
~1 | ~0000 0001 -> 1111 1110 | -2 |
~2 | ~0000 0010 -> 1111 1101 | -3 |
~3 | ~0000 0011 -> 1111 1100 | -4 |
~-3 | ~1111 1101 -> 0000 0010 | 2 |
~-2 | ~1111 1110 -> 0000 0001 | 1 |
~-1 | ~1111 1111 -> 0000 0000 | 0 |
뭔지 대충 감이 왔다면, 파이썬에선 실제로 어떻게 쓰일까?
1. 리스트 요소를 인덱싱할 때
우리가 파이썬을 처음 접할때 negative indexing 또한 배우게 된다.
그때 의문이 드는게, 단순히 인덱싱을 할땐 0부터 시작해서 i-1까지 슬라이싱할 수 있는데
왜 네거티브로 할때는 -0이 아닌 -1부터 시작할까? 라는 생각을 한다. (그에 따른 답변은 아직도 못찾았다)
그런 불편함을 해결해줄 수 있는게 ~ 인덱싱이다. (그런 불편을 해소하기 위해 만들어진 것은 아니다^^...)
negative 인덱싱처럼 동일하게 사용하는 대신, 0부터 시작한다
~0부터 ~i-1 까지 사용 가능하다.
네거티브 인덱싱의 -10과 비트 연산자 ~ 인덱싱 ~9가 동일한 수가 나온다는 걸 알 수 있다.
2. 데이터프레임에서 인덱싱할 때
가장 많이 사용하는 방법으로, 해당 조건의 단순 not 연산자처럼 사용할 수 있다.
데이터 프레임에서 ~연산자는 true가 false, false가 true가 된다.
보편적인 사용법을 알았다면, 특수적으로 많이 사용하는 상황은?
1. Check palindrome
*palindrome은 슈주 로꾸꺼에서 나오는 말처럼 거꾸로 해도 말이 되는 단어를 의미한다고 한다. 수박이박수..토마토..로꾸거로꾸꺼말해말
2. Remove NAN
데이터프레임에서 쓰인 방법과 동일하다. nan을 제외한 모두 행열을 나타나게 하였다.
참고 문헌:
https://blog.finxter.com/tilde-python/
https://www.pythonpool.com/python-tilde/
'프로그래밍 언어 > python' 카테고리의 다른 글
[COURSERA] Python 에서 데이터 베이스 사용하기 #1-1 (0) | 2022.01.17 |
---|---|
파이썬 막대그래프가 히스토그램처럼 붙어있는 현상 (0) | 2021.10.02 |