Python Language
비트 연산자
수색…
소개
비트 단위 연산은 비트 수준에서 이진 문자열을 변경합니다. 이러한 작업은 매우 기본적이고 프로세서에서 직접 지원합니다. 이러한 몇 가지 작업은 장치 드라이버, 저수준 그래픽, 암호화 및 네트워크 통신 작업에 필요합니다. 이 섹션은 파이썬의 비트 연산자에 대한 유용한 지식과 예제를 제공합니다.
통사론
x << y # 비트 왼쪽 시프트
x >> y # 비트 오른쪽 시프트
x와 y # 비트 AND
x | y # 비트 OR
~ x # Bitwise NOT
x ^ y # 비트 XOR
비트 AND
&
연산자는 2 진 AND 를 수행하며, 양쪽 피연산자에 비트가 있으면 복사됩니다. 그 의미는:
# 0 & 0 = 0
# 0 & 1 = 0
# 1 & 0 = 0
# 1 & 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 & 30
# Out: 28
# 28 = 0b11100
bin(60 & 30)
# Out: 0b11100
비트 OR
|
연산자는 바이너리 "or"를 수행합니다. 여기서 "or"는 피연산자에 비트가 있으면 복사됩니다. 그 의미는:
# 0 | 0 = 0
# 0 | 1 = 1
# 1 | 0 = 1
# 1 | 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 | 30
# Out: 62
# 62 = 0b111110
bin(60 | 30)
# Out: 0b111110
비트 XOR (배타적 논리합)
^
연산자는 정확히 하나의 피연산자의 값인 경우에만 이진 1
을 복사하는 이진 XOR 을 수행합니다. 이것을 설명하는 또 다른 방법은 피연산자가 다른 경우에만 결과가 1
이라는 것입니다. 예 :
# 0 ^ 0 = 0
# 0 ^ 1 = 1
# 1 ^ 0 = 1
# 1 ^ 1 = 0
# 60 = 0b111100
# 30 = 0b011110
60 ^ 30
# Out: 34
# 34 = 0b100010
bin(60 ^ 30)
# Out: 0b100010
비트 왼쪽 시프트
<<
연산자는 왼쪽 피연산자의 값이 오른쪽 피연산자가 제공 한 비트 수만큼 왼쪽으로 이동하는 비트 "왼쪽 시프트"를 수행합니다.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
왼쪽 비트 시프트 1
수행하는 것은 2
를 곱하는 것과 같습니다.
7 << 1
# Out: 14
n
의 왼쪽 비트 시프트 수행은 2**n
의한 곱셈과 같습니다.
3 << 4
# Out: 48
비트 오른쪽 시프트
>>
연산자는 비트 피연산자의 값이 오른쪽 피연산자에 의해 주어진 비트 수만큼 오른쪽으로 이동하는 비트 단위 "오른쪽 시프트"를 수행합니다.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
1
의 오른쪽 비트 시프트 수행은 2
로 정수 나누기와 같습니다.
36 >> 1
# Out: 18
15 >> 1
# Out: 7
n
의 오른쪽 비트 시프트 수행은 2**n
의한 정수 나누기와 같습니다.
48 >> 4
# Out: 3
59 >> 3
# Out: 7
비트 NOT
~
연산자는 숫자의 모든 비트를 뒤집습니다. 컴퓨터는 부호가있는 숫자 표현을 사용하기 때문에 가장 중요한 것은 음수가 앞에 오는 영 (0) 대신 앞에 오는 숫자 (1)로 작성된 음수 2 진수를 인코딩하는 2의 보수 표기법 입니다.
즉, 8 비트를 사용하여 2의 보수를 나타내는 경우 0000 0000
에서 0111 1111
까지 패턴을 처리하여 0에서 127까지의 숫자를 나타내고 1xxx xxxx
는 음수를 나타냅니다.
8 비트 2의 보수
비트 | 부호없는 값 | 2의 보수 값 |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
0000 0010 | 2 | 2 |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | 128 자 | -128 |
1000 0001 | 129 | -127 |
1000 0010 | 130 | -126 |
1111 1110 | 254 | -2 |
1111 1111 | 255 자 | -1 |
본질적으로 이것은 1010 0110
이 (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
(128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
(128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
)의 2의 보수 값을가집니다. (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
이런 식으로 음수는 -128 ( 1000 0000
)까지 내려갑니다. 영 (0)은 0000 0000
으로 표시되고 마이너스 1 ( 1111 1111
)은 1111 1111
됩니다.
그러나 일반적으로 이것은 ~n = -n - 1
합니다.
# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111
# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110
# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101
# 123 = 0b0111 1011
~123
# Out: -124
# -124 = 0b1000 0100
요약하면 양수에 적용될 때, 이러한 동작의 전반적인 효과를 참고
~n -> -|n+1|
음수에 적용하면 해당 효과는 다음과 같습니다.
~-n -> |n-1|
다음 예제는이 마지막 규칙을 설명합니다 ...
# -0 = 0b0000 0000
~-0
# Out: -1
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always
# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000
# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001
# -123 = 0b1111 1011
~-123
# Out: 122
# 122 = 0b0111 1010
내부 운영
모든 비트 연산자 ( ~
제외)는 고유 한 in place 버전을가집니다.
a = 0b001
a &= 0b010
# a = 0b000
a = 0b001
a |= 0b010
# a = 0b011
a = 0b001
a <<= 2
# a = 0b100
a = 0b100
a >>= 2
# a = 0b001
a = 0b101
a ^= 0b011
# a = 0b110