바위타는 두루미

[개념정리] 비트조작 본문

Study/Interview준비

[개념정리] 비트조작

DoRoMii 2019. 8. 2. 19:21
728x90

- 몇가지 비트 트릭

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
Comments