파이썬 비트연산
파이썬의 비트연산도 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문을 이용해 출력해보면 위와 같이 반대로 출력되게 됩니다