0%

位运算

位运算是一组在二进制位级别上操作数据的运算操作,直接对二进制位进行操作。常见的位运算操作如下:

  • 按位与&:将两个操作数对应的位进行逻辑与操作,都为1时为1,否则为0。

  • 按位或|:将两个操作数对应的位进行逻辑或操作,有一个为1时为1,否则为0。

  • 按位异或^:将两个操作数对应的位进行异或操作,对应位不同时为1,相同时为0。

  • 按位取反~:将两个操作数对应的位进行取反操作,0变为1,1变为0。

  • 左移<<:将操作数的所有位向左移动指定的位数,左移会在右侧补0,相当于原数进行乘以2的幂数操作。‘

  • 右移>>:将操作数的所有位向右移动指定的位数。右移操作 可以分为算术右移和逻辑右移,算术右移在左侧补符号位,

    逻辑右移则是在左侧补0。

实现一个函数,一个Byte的8bit,两两一组,调用一次自增,最大3。

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
45
#include <stdio.h>
#include <stdint.h>

void printBinary(unsigned char value, int bitlen)
{
int i = bitlen-1;
for (i; i >= 0; i--) {
printf("%d", (value >> i) & 0x1);
}
printf("\n");
}

// shi bu shi chang sha wan shi bu shi
void increamentValue(unsigned char *value, int group)
{
int shift = group * 2;
unsigned char mask = 0x3 << shift;
unsigned char groupValue = (*value & mask) >> shift;
if (groupValue < 3) {
groupValue++;
*value = (*value & ~mask) | (groupValue << shift);
}
}

int main(int argc, char *argv[])
{
unsigned char value = 0x0;
printBinary(value, 8);

increamentValue(&value, 0);
increamentValue(&value, 0);
increamentValue(&value, 0);

increamentValue(&value, 2);
increamentValue(&value, 2);
increamentValue(&value, 2);

increamentValue(&value, 1);
increamentValue(&value, 1);
increamentValue(&value, 1);

//printf("%u\n", ~value);
printBinary(value, 8);
return 0;
}
小主,路过打个赏再走呗~