Python to AI

Python 애증의 비트연산자

최 수빈 2024. 10. 30. 21:20
a = 5 #이진수로 101

print(~a) #bit NOT 연산 -6
print(a<<1) #이진수로 1010 왼쪽 shift
print(a>>1) #이진수로 010 오른쪽 shift

 
다른건 모르겠고 보수랑 shift는 볼.때.마.다. 이해가 안됨 
볼 때마다 끝에는 결국 아~알겠다~~~~~ 하고 넘어가는데 다시보면 이해가 안됨.. python으로 코드짤 때 잘 안쓰기도 하고.. ... 그냥.. 평소에 잘 안쓰기도 하고요..? (저만,,안씁니까,,,,?)

하지만 이번에는 진짜 제대로 확실하게 정리하고 넘어가서 ! 다시는 ! 뒤돌아보지 않도록! 
 
먼저 비교적 쉬운 


왼쪽 시프트
 

  • a의 이진수를 왼쪽으로 1비트씩 이동. 오른쪽에 0을 추가합니다.
  • 101 << 1 = 1010 (10진수 10)

오른쪽 시프트
 

  • a의 이진수를 오른쪽으로 1비트씩 이동. 왼쪽에 0을 추가합니다.
  • 101 >> 1 = 010 (10진수 2)

여기서 진짜 이해가 안됐다...... 101을 오른쪽으로 1비트씩 이동하면 뭐 어쩌라고.. 101이 이동한다고 뭐 달라지나.. 만약에 달라지면? 제일 오른쪽에 1은 어떻게 되는건데....? ..없어진다. 없애라.!!!!!! 낭떠러지로 밀어내라 
 
 
 

다음은 2의 보수 !!!!!!!!!!!!!!!!!!

보수가 보충해 주는 수라니요? 補數..? 2의 보수는.. Two's Complement? 

몰라떠여... ㅎ..  ;ㅅ;...왜 이제서야 보였을까요 ?
 
일단 보수보수방식을 잘 구분해서 생각해주세요.

 

 

우리가 가장 익숙한 10진수에서 10의 보수 방법에서 9의 보수를 이용해보자.  

 

45이라는 수가 있다면 9의 보수는 54다. 각 자릿수를 9로 보충해주는 수 ! 
10의 보수 방식에 9의 보수를 이용하는 경우
45의 10의 보수는 9의 보수(54) + 1= 55다.

 

 

9의 보수를 사용하지 않고 10의 보수를 구하는 방법

 

45를 예로 든다면, 45는 두자릿수이고 다음 자릿수는 100이다. 

이 100에서 45를 뺀다. 그럼 10의 보수인 55가 나온다.

 

-> 자리 올림(carry)을 반영해야 한다는 점이 번거롭다.

 

 
이걸 그대로 2의 보수에 적용하면 된다.
 
반전한다는 표현은 결국 1과 0만 사용하는 2진수에서 1은 0으로, 0은 1로 1의 보수를 구하는 것과 같다.
 
 
아 그리고 python에서 결과해석을 이 2의 보수 방식을 사용해서 음수로 해석한다.
~연산자가 비트반전 후 가장앞쪽비트 0은 양수 1은 음수로 부호비트,  2의 보수 해석 적용해서 비트 반전 후 +1하고 10진수로 바꿔준다. 그럼 음수10진수 완성 !
 
 
 
 
귀찮으면..그냥.. -(n+1) 외우기 츄천...~~