Daylogs/Python

2진수와 16진수 표현하기

ohgyun 2013. 1. 9. 15:36


발생일: 2013.01.09

문제:
지난 노트들을 정리하다가 오래 전에 기록해뒀던 2/8/16 진수 표현에 대한 메모를 발견했다.

진수 변환이나 비트 연산은 참 볼 때마다 새롭다. ㅎㅎ

굳이 이 기분을 표현해보자면,..
꼭 천 단위로 숫자를 끊어 읽는 것 같다.
아주 익숙하지만, 얼마인지 알려면 맨 끝에서부터 다시 세어봐야 하는 것 같달까.. -_-a
(예: 142,324,242,000)

여튼, 얼마 전 파이썬을 익히면서 비트 연산 활용법에 대한 부분도 공부한 적이 있어,
예전 노트와 묶어 메모해두려고 한다.


해결책:

기수(base)
B진법: 기수를 B로 정수를 표현하는 방법 (예: 10진법, 16진법)

10진수: Decimal (23)
2진수: Binary (10111)
8진수: Octal (0으로 시작한다. 027)
16진수: HexaDecimal 또는 Hex (0x로 시작한다. 0x17)


2진수
2진수: Binary, 여기서는 음수와 관계없이 비트를 표시하는 Unsigned Binary를 생각하면 된다.

unsigned binary의 특징:
  1. n 비트로 2^n 개의 패턴이 가능하다.
  2. n 비트로 0 ~ 2^(n-1) 까지 표현가능하다.
  3. n 비트로 0은 0..0..0 (모두 0)으로 표현된다.
  4. n 비트로 나타낼 수 있는 최대 수는 2^(n-1)이며, 이 값은 홀수이다.


변환
8진수와 16진수는 2진수로 변환하기 쉽다.
각 자리의 수를 2진수로 바꿔 나열하기만 하면 된다.
8진수는 3개씩, 16진수는 4개씩 묶음을 만들면 된다.

027 = 8 * 2 + 7= 23
010 111

0x17 = 16 * 1 + 7 = 23
0001 0111


진수의 곱
2진수에 2를 곱하는 것은 끝에 0을 붙이는 것과 같다.
비트를 왼쪽으로 이동하는 것(left shift)도 같은 것을 의미한다.

0001    1
0010    2
0100    4
1000    8

B 진수로 나타낸 수에 10진수로 표현한 B를 곱하는 것은 끝에 0을 붙이는 것과 같다.
8B3<16> x 16^3<10> = 8B3000<16>
0x8B3 x 16^3 = 0x8B3000


진수의 나눗셈
B 진수를 B로 나눈 것은 끝에서 0을 제거하는 것과 같다.

0x8B3 / 16 = 0x8B, 3
몫(quotient) : 0x8B
나머지(reminder) : 0x3


좀 더 자세하게 들여다보려면, 아래 포스트를 참고해보자.
2진수와 16진수에 대해 아주 잘 정리해놓았다.



덧) 비트 연산의 활용

- AND (&) : 두 비트가 같을 경우 1, 주로 마스크로 활용한다.
- OR (|) : 두 비트 중 하나라도 같을 경우 1, 주로 모든 비트를 켜려고 할 때 사용한다.
- XOR (^) : 두 비트가 다른 경우 1, 비트의 값을 토글할 때 사용한다.
- NOT (~) : 비트를 뒤집는다. 수에 1을 더한 후 음수를 취한 것과 같다.


아래는 파이썬으로 비트 연산을 테스트해본 코드이다.

>> 0b101 # binary: 0bxxxx 
5

>> bin(5) # to binary string
'0b101'

>> int('0b101, 2) # int(string, base)
5

>> mask = 0b100

>> bin( 0b101 & mask ) # AND for masking
'0b100'

>> bin( 0b101 | mask ) # OR for turning on
'0b111'

>> bin( 0b101 ^ mask ) # XOR for toggling
'0b1' # 0b001

>> bin( 0b101 << 2 )  # same with value * (2**n)
'0b10100'

>> bin ( 0b101 >> 2 ) # same with value / (2**n)
'0b1'




반응형