티스토리 뷰
발생일: 2013.01.09
문제:
지난 노트들을 정리하다가 오래 전에 기록해뒀던 2/8/16 진수 표현에 대한 메모를 발견했다.
문제:
지난 노트들을 정리하다가 오래 전에 기록해뒀던 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'
반응형
댓글
공지사항