새소식

언어/파이썬(Python)

8. 파이썬 비트연산(shift), 논리 연산(and, or, not)

  • -

 

파이썬 비트연산

파이썬의 비트연산도 c, java와 다를게 없습니다

>> 오른쪽 shift
<< 왼쪽 shift
& 비트 AND
^ 비트 XOR
| 비트 OR

 

두개의 shift 연산과 &, ^, | 연산이 있습니다

위 모든 연산을 하기 위해서는 2진수로 생각해서 계산하시면 됩니다

 

shift 연산

우선 shift 연산은 왼쪽 shift와 오른쪽 shift 연산이 있습니다

10진수 8을 가지고 비트연산 해보겠습니다

8을 오른쪽으로 한칸 shift 하면 4

왼쪽으로 한 칸 shift 하면 16이 됩니다 왜이렇게 나올까요???

8은 2진 수로 0b1000 입니다

맞죠????

여기서 저 숫자를 가지고 숫자를 한 칸씩 움직이면 됩니다

왼쪽으로 1칸 이동 0b10000 = 16
오른쪽으로 1칸 이동 0b100 = 4

위의 표를 보면 쉽게알 수 있습니다

왼쪽으로 밀어야 하는데 칸이 없다구요?? 칸을 하나 만드세요 0으로!!

그러면 01000입니다 여기서 왼쪽으로 한칸 씩 밀면 10000이 됩니다

오른쪽으로 미는 경우는 오른쪽 끝에 있는 비트는 없어진다고 생각하면 됩니다

 

이를 응용하면 숫자를 2배씩 늘리거나 알고리즘에서 bit masking에 사용할 수 있습니다

그리고 주로 임베디드 쪽에서 많이 사용됩니다(주소값 연산시)

물론 임베디드에서 사용시엔 c언어를 사용하지만요... 기본적인 연산 방법은 같습니다

 

&연산

이 연산은 비트끼리의 AND 연산입니다

연산 전 연산 후
1&1 1
1011 & 1111 1011
101101 & 101010 101000

위의 표를 보고 하나씩 계산해보시면 아실 수 있을겁니다

같은 자리수 끼리 &연산을 하며 두 수 모두 1인 경우에만 1이됩니다

1011 & 1111을 보면 자리수 끼리 연산을 하는데 왼쪽에서 2번째 자리수는 1011에서 0입니다

그렇기 때문에 이 자리수를 제외한 나머지는 1이 되서 1011이 됩니다

 

^연산

이는 XOR연산으로 연산하는 두 비트의 값이 다르면 1이 됩니다

연산 전 연산 후
1 ^ 0 1
1 ^ 1 0
1011 ^ 1111 0100

 

여기서 계속 사용하는 숫자는 모두 2진수 입니다

그래서 파이썬 내에서 2진수 형태로 ^ 연산을 하면 값이 잘 나오는 모습을 볼 수 있습니다

1 ^ 1이 1인 이유는 두 비트가 1로 같기 때문에 0 이됩니다

1 ^ 0은 두 비트가 다르기 때문에 1이 됩니다

1011 ^ 1111은 왼쪽에서 2번째 비트를 제외한 나머지 비트가 모두 같기 때문에 나머지는 모두 0이 됩니다

 

| 연산

|는 OR 연산입니다.

이는 보통 백스페이스 밑에 달러표시와 함께 위치하고 있습니다.

shift + \ 을 하면 '|'을 사용할 수 있습니다

이는 연산하는 두 비트중 하나만 1이어도 1이 됩니다

연산 전 연산 후
1 | 1 1
1 | 0 1
0 | 0 0
0 | 1 1
11111 | 01110 11111

위의 진리표와 예제를 보시면 쉽게 이해하실 수 있을겁니다

 

파이썬 논리연산

파이썬에서의 논리 연산은 c, java와는 문법이 다릅니다

C, Java Python
&& and
|| or
! not

위와 같이 다른 것을 볼 수 있습니다

and, or, not 모두 소문자로만 사용해야 합니다

 

and 연산

True and True True
True and False False
False and True False
False and False False

진리표는 다음과 같습니다

양쪽의 조건이 모두 참일 경우에만 참이 됩니다

 

&& 연산은 위와 같이 사용할 수 있습니다

왼쪽 조건과 오른쪽 조건 모두 만족하는 경우 True가 되서 yes를 출력하게 됩니다

 

or 연산

 

True or True True
True or False True
False or True True
False or False False

이는 양쪽의 조건중 하나만 참이어도 True가 되게 됩니다

 

not 연산

이 연산은 조건의 논리값을 바꿀 수 있습니다

not True False
not False True

print문을 이용해 출력해보면 위와 같이 반대로 출력되게 됩니다

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.