본문 바로가기
프로그래밍 언어/python

파이썬 물결표 ~ 의미 (python tilde)

by gokite 2022. 1. 4.

어느 날 ~를 잔뜩 넣은 휘황찬란한 코드를 보았고, 머리로는 ~의 쓰임새를 알고 있으나 마음으로..이해가 되지 않아 정리를 결심하게 되었다. 

~를 뭐라고 부르는 지 몰라 구글링 하는 데 꽤나 애를 먹었고, 도저히 찾을 수가 없어

파이썬 물결표 -> 물결표 영어로 -> 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

https://technote.kr/199

 

[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

https://yiyj1030.tistory.com/83