반응형
비트마스킹
이진수 표현을 이용한 연산
연산 속도가 빠르고 메모리를 적게 차지하는 장점을 가지고 있다
비트연산자
연산자 | 연산 | 예시 |
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
주의사항
비트 연산은 정수 타입의 변수에만 사용이 가능하며, 실수 타입에서는 사용이 불가능함
반응형