VioletaBabel

비트 조작 본문

기본개념/알고리즘공부
비트 조작
Beabletoet 2017. 9. 11. 22:26

& = and

| = or

^ = xor (비트가 달라야 1)

~ = not

<< = X

>> = ÷


--

x^0 = x

x^1 = ~x

x^x = 0


x&0 = 0

x&1 = x

x&x = x


x|0 = x

x|1 = 1

x|x = x


x+x = x*x = x<<2

x^(~x) = 1

x*100 = x<<2

~0<<2 = 1100 (마지막 두 비트 빼고 다 1이 됨)


--

논리 시프트

>>>, <<< 연산

우측으로 이동 시 최상위 비트에 0을 채운다.


산술 시프트

>>, << 연산

우측으로 이동시 최상위 비트를 유지한다. (= 부호 유지)


--

비트값 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <cstdio>
bool getBit(int num, int i);
int setBit(int num, int i);
int delBit(int num, int i);
int delLeftBits(int num, int i);
int delRightBits(int num, int i);
int changeBit(int num, int i, bool truebit);
int main()
{
    printf("%d\n",getBit(72));
    printf("%d\n", setBit(74));
    printf("%d\n", delBit(72));
    printf("%d\n", delLeftBits(71));
    printf("%d\n", delRightBits(71));
    printf("%d\n", changeBit(710));
}
bool getBit(int num, int i)
{//1을 i만큼 왼쪽으로 시프트한 곳의 비트가 1인지 0인지 확인
    return ((num&(1 << i)) != 0);
}
int setBit(int num, int i)
{//1을 i만큼 왼쪽으로 시프트한 곳의 비트를 1로 바꿈
    return num | (i << 1);
}
int delBit(int num, int i)
{//1을 i만큼 왼쪽으로 시프트한 곳의 비트만 삭제
    int d = ~(1 << i);
    return num&d;
}
int delLeftBits(int num, int i)
{//최상위 비트에서 1을 i만큼 왼쪽으로 시프트한 곳까지 삭제
    int d = (1 << i) - 1;
    return  num&d;
}
int delRightBits(int num, int i)
{//1을 i만큼 왼쪽으로 시프트한 곳에서 가장 낮은 수의 비트까지 삭제
    int d = (-1 << (i + 1));
    return  num&d;
}
int changeBit(int num, int i, bool truebit)
{//i번째 비트값을 truebit로 바꿔준다.
    int v = truebit ? 1 : 0, d = ~(1 << i);
    return (num&d) | (v << i);
}
cs


'기본개념 > 알고리즘공부' 카테고리의 다른 글

시스템 설계 및 규모 확장성  (0) 2017.09.14
객체 지향 설계  (0) 2017.09.13
그래프  (0) 2017.09.09
트리  (0) 2017.09.08
  (0) 2017.09.08
Comments