바위타는 두루미
[개념정리] 비트조작 본문
- 몇가지 비트 트릭
1. 0110+ 0110 은 0110을 왼쪽으로 한번 쉬프트 한 것과 같다.
- 0110 *2 와 같기 때문에
2. 0100 * 0011은 0011을 왼쪽으로 두번 쉬프트 한 것과 같다.
- 0100은 4이기 때문에 0011*4와 동일
3. 1101 ^ (~1101) 은 모든 비트가 1이 된다.
- XOR연산은 두 비트가 다를때 1을 가지는데 NOT연산으로 모든 비트를 반전 시켰으므로 각 비트들은 서로 다르다.
4. 1011 & (~0 <<2) 는 뒤의 두개의 비트를 삭제한 값을 얻을 수 있다.
- ~0은 모든 비트가 1일 것이고 그것을 왼쪽으로 쉬프트하면 왼쪽 두 비트만 0을 가지는 수가 된다. 이 수를 가지고 &연산을 하면 뒤의 두 비트는 모두 0이된다.
-비트 조작을 할 때 알아야할 것
x ^ 0s = x x & 0s = 0 x | 0s = x
x ^ 1s = ~x x & 1s = x x | 1s = 1s
x ^ x = 0 x & x = x x | x = x
-2의 보수와 음수
컴퓨터는 일반적응로 정수를 저장할때 2의 보수 형태로 저장한다.
양수를 저장할 때는 아무 문제 없지만 음수를 표현할 때에는 그 수의 절대값에 부호비트를 1로 세팅한 뒤 2의 보수를 취한 형태로 저장한다.
양수 | 음수 | ||
7 | 0111 | -1 | 1111 |
6 | 0110 | -2 | 1110 |
5 | 0101 | -3 | 1101 |
4 | 0100 | -4 | 1100 |
3 | 0011 | -5 | 1011 |
2 | 0010 | -6 | 1010 |
1 | 0001 | -7 | 1001 |
0 | 0000 |
위의 표는 4비트 정수값들을 나열한 것이다.
위의 상황에서 왼쪽과 오른쪽의 절대값을 더하면 8이 됨을 알 수있다.
부호비트를 뺀 왼쪽과 오른쪽의 2진수 값이 같은 두 수의 절대값의 합은 8이 된다.
-산술 우측 쉬프트 vs 논리 우측 쉬프트
산술 우측 쉬프트 : 비트를 오른쪽으로 옮긴 다음에 최상위 비트를 0으로 체워넣는것
논리 우측 쉬프트 : 비트를 오른쪽으로 옮긴 다음에 최상위 비트를 유지하는 것
-기본적인 비트조작
1. 비트값 확인
1을 i번 쉬프트 한 값과 num값을 &연산했을때 0인 경우에는 그 위치의 비트는 0이고 그렇지 않으면 1이다.
def getBit(num, i):
return num & (1 <<i)
2. 비트값 채워넣기
1을 i번 쉬프트 한 값과 num값을 | 연산 했을때 해당위치는 1로 체워지고 나머지에는 영향을 미치지 않는다.
def setBit(num, i):
return num | ( 1 << i )
3. 비트값 삭제하기
1을 i번 쉬프트 한 값을 NOT연산으로 반전시킨 다음에 &연산을 하면 해당 위치만 0으로 바뀌고 나머지에는 영향이 없다
def clearBit(num , i ):
return num & ~( 1<< i)
4. 비트값 바꾸기
우선 값을 바꾸려면 해당위치를 0으로 바꾸어 준 다음에 원하는 값 v(0또는 1)을 채워넣으면 된다.
def updateBit(num, i , bitIs1):
value = 1 if bitIs1 else 0
mask = ~(1 << i)
return num & mask | (value << i )
'Study > Interview준비' 카테고리의 다른 글
5.2 2진수를 문자열로 (0) | 2019.08.02 |
---|---|
5.1 삽입 (0) | 2019.08.02 |
4.12 합의 경로 (0) | 2019.07.29 |
4.11 임의의 노드 (0) | 2019.07.29 |
4.10 하위 트리 확인 (0) | 2019.07.29 |