VioletaBabel
비트 조작 본문
& = 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(7, 2)); printf("%d\n", setBit(7, 4)); printf("%d\n", delBit(7, 2)); printf("%d\n", delLeftBits(7, 1)); printf("%d\n", delRightBits(7, 1)); printf("%d\n", changeBit(7, 1, 0)); } 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 |
Comments