본문 바로가기

Computer Science/etc

비트마스킹 (Bitmasking)

반응형

비트마스킹

이진수 표현을 이용한 연산

연산 속도가 빠르고 메모리를 적게 차지하는 장점을 가지고 있다

 

비트연산자

연산자 연산 예시
a & b and

두 비트가 모두 1일 시 1, 이외 0
1011(2) & 1110(2)

-> 1010(2)
a | b or

두 비트가 모두 0일 시 0, 이외 1
1011(2) | 1110(2)

-> 1111(2)
a ^ b xor

두 비트가 같을 시 0, 다를 시 1
1011(2) ^ 1110(2)

-> 0101(2)
~ a not

비트가 1일 시 0, 0일 시 1
~ 1011(2)

-> 0100(2)
a << b left shift

a 비트를 왼쪽으로 b칸 만큼 이동
1011(2) << 1

-> 10110(2)
a >> b right shift

a 비트의를 오른쪽으로 b칸 만큼 이동
1011(2) >> 1

-> 0101(2)

 

* 파이썬에서 양수에 not 연산을 사용하면 음수가 나오는 이유

더보기

not 연산을 실제로 사용해보면 생각했던 것과 다르게 값이 나오는 현상을 발견할 수 있었다.

>> n=11
>> bin(n)
'0b1011'
>> ~n
-12
>> bin(~n)
'-0b1100'

 

11을 이진수로 변환하면 1011 이니 not 연산을 사용하면 실제로는 0100에 해당하는 4가 나와야 할 것 같지만

실제로는 11에 not 연산을 사용 시 뜬금없이 음수가 결과값으로 나온다.

 

해당 현상에 대한 chatGPT의 답변은 다음과 같았다.

 


파이썬에서 비트마스킹을 사용할 때 양수에 ~ (비트 NOT) 연산을 적용하면 음수가 나오는 이유는 파이썬에서 정수를 2의 보수 형태로 저장하기 때문입니다. 2의 보수 형태는 음수를 표현하기 위한 일반적인 방법으로, 이것은 컴퓨터에서 정수 값을 효과적으로 다루는 데 사용됩니다.

다음은 이러한 동작 방식의 간단한 설명입니다:

1. 양수의 이진 표현: 양의 정수 n은 이진수로 표현될 때, 가장 왼쪽 비트(최상위 비트 또는 MSB)가 0입니다.

2. 2의 보수 표현: 음수를 나타내기 위해 컴퓨터는 해당 양수의 비트를 반전하고 1을 더한 값을 사용합니다. 즉, 음수의 이진 표현은 해당 양수의 모든 비트를 반전한 후 1을 더한 것입니다.

3. ~ (비트 NOT) 연산: ~ 연산은 비트를 반전시킵니다. 따라서 양수에 ~를 적용하면 모든 비트가 반전되며, 이로 인해 해당 값을 2의 보수 형태의 음수로 바꾸게 됩니다.

예를 들어, 5의 2의 보수 표현은 다음과 같습니다:


5 (양수) = 00000101 (이진)
-5 (음수) = 11111011 (이진)


따라서, ~5는 ~00000101이 되며, 이는 11111010으로, 이진으로 표현하면 -6이 됩니다.
결국, 파이썬에서 양수에 ~ 연산을 적용하면 해당 양수의 2의 보수 형태의 음수로 변환됩니다.

 

그 외

bin() : 10진수를 2진수로 변환, '0b{2진수}'의 형태로 반환됨 (str)

 

.bit_count() : 주어진 10진수를 2진수로 변환했을 때 1의 개수가 몇 개인지 반환

 

.bit_length() : 주어진 10진수를 2진수로 변환했을 때 몇 자리인지 반환

>> n=65
>> bin(n)
'0b1000001'
>> n.bit_count()
2
>> n.bit_length()
7

 

주의사항

비트 연산은 정수 타입의 변수에만 사용이 가능하며, 실수 타입에서는 사용이 불가능함

반응형