수색…


소개

비트 단위 연산은 비트 수준에서 이진 문자열을 변경합니다. 이러한 작업은 매우 기본적이고 프로세서에서 직접 지원합니다. 이러한 몇 가지 작업은 장치 드라이버, 저수준 그래픽, 암호화 및 네트워크 통신 작업에 필요합니다. 이 섹션은 파이썬의 비트 연산자에 대한 유용한 지식과 예제를 제공합니다.

통사론

  • 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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow