1 位运算符
- 位与&
0&1 = 0; 1&1=1;0&0=0;1&0=0;
(0或1)与1位与无变化,与0位与变成0; - 位或|
0|1=1;1|1=1;0|0=0;1|0=1;
(0或1)与1位或变成1,与0位或无变化; - 位异或^
0^1=1;1^1= 0;0^0=0;1^0=1;
(0或1)与1位异或会取反,与0位异或无变化; - 位取反~
- 左移位<<
- 右移位>>
c语言的移位取决于数据类型:
对于无符号数,左移右侧补0(相当于逻辑移位)
对于无符号数,右移左侧补0(相当于逻辑移位)
对于有符号数,左移右侧补0(算术移位,相当于逻辑移位)
对于有符号数,右移左侧补符号位(算术移位,正数补0,负数补1)
2 逻辑运算符
逻辑运算符的计算结果为1或0
- 逻辑与&&
- 逻辑或||
- 逻辑反!
3 操作寄存器
步骤:读--改--写
- 特定位清零:&
- 特定位置1:|
- 特定位取反:^
- 多部份叠加:|
4 构建特定二进制数
bit31 ~ bit0
判断第20位是0还是1?
a & (1<<20)
(a>>20) &1
(a<<11) < 0特定位为1的二进制数
bit3~bit7为1,其他位为0:(0x1f<<3)
bit3~bit7为1,bit23~bit25为1,其他位为0:( (0x1f<<3) | (0x7<<23) )特定位为0的二进制数
bit4~bit10为0,其余位为1:~(0x7f<<4)设置整型数a的bit3
a = a | (1<<3)
a |= (1<<3)设置整型数a的bit3~bit7
a |= (0x1f<<3)
a |= (0b11111<<3)清除整型数a的bit15
a &= (~(1<<15))清除整型数a的bit15~bit23
a &= (~(0x1ff<<15))取出整型数a的bit3~bit8
a = (a & 0x3f<<3)>>3给寄存器的bit7~bit17赋值937
a = (937<<7) | (a & (~(0x7ff<<7)))给寄存器bit7~bit17的值加17
a = ( (a & 0x7ff<<7) + (17<<7) ) | ( a & ( ~(0x7ff<<7) ) )给寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17
a = ( (~((0x7ff<<7) | (0x1f<<21))) & a) | (937<<7) | (17<<21)
5 宏定义完成位运算
用宏来置位、复位(最右边为第1位)
#define SET_NTH_BIT(x, n) ( x | ((1U)<<(n -1)) )
#define CLEAR_NTH_BIT(x, n) ( x & ~((1U)<<(n - 1)) )
U:无符号的左移和右移均相当于逻辑移位用宏来置位、复位第n位到m位 (最右边为第1位,m为高位)
难点:要得到 (m-n+1)个1
思路:0按位取反后再右移
~0U>>(32U - (m-n+1) )
#define SET_NTH_TO_MTH_BIT(x, n, m) ( x | ((~0U>>(32U - (m-n+1) )) << (n-1)) )截取变量的部分连续位 (最右边为第1位,m为高位)
#define GET_NTH_TO_MTH_BIT(x, n, m) ( (x >> (n-1)) & ( ~0U>>(32-(m-n+1)) ) )
1 #include<stdio.h>
2
3 #define SET_NTH_BIT(x, n) ( x | ((1U)<<(n-1)) )
4 #define CLEAR_NTH_BIT(x, n) ( x & ~((1U)<<(n-1)) )
5 #define SET_NTH_TO_MTH_BIT(x, n, m) ( x | ((~0U>>(32-(m-n+1)))<<(n-1)) )
6 #define GET_NTH_TO_MTH_BIT(x, n, m) ( (x>>(n-1)) & (~0U>>(32-(m-n+1))) )
7
8 int main()
9 {
10 unsigned int i = 0xf00;
11 unsigned int s = 0, c = 0, sNM = 0, gNM = 0;
12
13 s = SET_NTH_BIT(i, 1);
14 printf("excepted result:0xf01\ng = 0x%x\n\n", s);
15
16 c = CLEAR_NTH_BIT(i, 9);
17 printf("excepted result:0xe00\ng = 0x%x\n\n", c);
18
19 sNM = SET_NTH_TO_MTH_BIT(i, 5, 8);
20 printf("excepted result:0xff0\ng = 0x%x\n\n", sNM);
21
22 gNM = GET_NTH_TO_MTH_BIT(i, 9, 12);
23 printf("excepted result:0xf\ng = 0x%x\n\n", gNM);
24
25 return 0;
26 }
//输出
excepted result:0xf01
g = 0xf01
excepted result:0xe00
g = 0xe00
excepted result:0xff0
g = 0xff0
excepted result:0xf
g = 0xf