파이썬 물결표 ~ 의미 (python tilde)
어느 날 ~를 잔뜩 넣은 휘황찬란한 코드를 보았고, 머리로는 ~의 쓰임새를 알고 있으나 마음으로..이해가 되지 않아 정리를 결심하게 되었다.
~를 뭐라고 부르는 지 몰라 구글링 하는 데 꽤나 애를 먹었고, 도저히 찾을 수가 없어
파이썬 물결표 -> 물결표 영어로 -> 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/
Tilde (~) Operator in Python – Finxter
What is the Tilde ~ in Python? Python’s Tilde ~n operator is the bitwise negation operator: it takes the number n as binary number and “flips” all bits 0 to 1 and 1 to 0 to obtain the complement binary number. For example, the tilde operation ~1 beco
blog.finxter.com
https://www.pythonpool.com/python-tilde/
Some Useful Things About Tilde Operator in Python
In this article, we will learn about a tilde operator in python. Tilde operator is one of the types in Bitwise operator. ~ is a symbol that denotes a
www.pythonpool.com
[04-2] Python - 논리연산자/비트연산자 (boolean/bitwise operation)
언듯 보기에 논리연산자와 비트연산자가 유사해서 그 차이점이 헷갈렸다. 논리연산자의 "and"와 비트연산자의 "&"는 결국 같은 "그리고"가 아닌가? 논리연산자의 "or"와 비트연산자의 "|"는 결국 같
technote.kr
https://yiyj1030.tistory.com/83
2의 보수란?? 쉬운 설명으로 궁금증 해결.. (비트 연산)
2의 보수: 컴퓨터가 음수를 저장하기 위해 사용하는 방법 중 하나. 예를 들어 4비트 머신을 생각해보자. 이 머신은 0000부터 1111부터 표현이 가능하다. 총 16개. 양수만을 저장하고싶다면 숫자 0부
yiyj1030.tistory.com