1、位与(&)、位或(|)、位异或(^)总结
a、位与:二进制数(0/1),与1位与无变化,与0位与变成0
b、位或:二进制数(0/1),与1位或变成1,与0位或无变化
c、位异或:二进制数(0/1),与1位异或是取反,与0位异或无变化(相同为0,不同为1)
2、左移位 << 与右移位 >>
C语言的移位要取决于数据类型
对于无符号数,左移时右侧补0(相当于逻辑移位)
对于无符号数,右移时左侧补0(相当于逻辑移位)
对于有符号数,左移时右侧补0(叫算术移位,相当于逻辑移动)
对于有符号数,右移时左侧补符号位(正数补0,负数补1,算术移位)
3、位与位或位异或在操作寄存器时的特殊作用
寄存器操作的要求(特定位改变而不影响其他位)
a、ARM时内存与IO统一编址的,ARM中有很多内部外设,SoC中CPU通过向这些内部外设的寄存器写入
一些特定的值来操控这个内部外设,进而操控硬件动作。所以说:读写寄存器就是操作硬件。
b、寄存器的特点就是按位进行规划和使用。
c、寄存器操作要求就是:在设定特定位时不能影响其他位。
d、如何做到?答案是:读-改-写三部曲。
4、特定位清零用 &
example:
假定原来寄存器的值为:0xAAAAAAAA,现将bit7-bit15清零,其他位不变。
操作:rRegister &= ~(0x1FF << 7);
5、特定位置1用 |
example:
假定原来寄存器的值为:0xAAAAAAAA,现将bit7-bit15置1,其他位不变。
操作:rRegister |= (0x1FF << 7);
6、特定位取反用 ^
example:
假定原来寄存器的值为:0xAAAAAAAA,现将bit7-bit15取反,其他位不变。
操作:rRegister ^= (0x1FF << 7);
7、实战演练
a、给定一个整数a,设置a的bit3,保证其他位不变。
unsiged int a = 0;
a |= (0x01 << 3);
b、给定一个整数a,设置a的bit3~bit7,保证其他位不变。
unsigned int a = 0;
a |= (0x1F << 3);
c、给定一个整数a,清除a的bit15,保证其他位不变。
int a = 0xFFFFFFFF;
a &= (~(0x01 << 15));
d、给定一个整数a,清除a的bit15~bit23,保证其他位不变。
unsigned int a = 0xFFFFFFFF;
a &= (~(0x1FF << 15));
e、给定一个整数a,取出a的bit3~bit8。
unsigned int a = 0xFFAAFFAA;//110101
int b = (a >> 3) & 0x3F;
f、用C语言给一个寄存器bit7~bit17赋值937,其他位不受影响。
unsiged int iReg = 0xFFAAFFAA;
iReg &= ~(0x7FF << 7);
iReg |= (937 << 7);
g、用C语言给一个寄存器bit7~bit17的值加17,其他位不受影响。
unsigned int iReg = 0xFFAAFFAA;
unsigned iTemp = ((iReg >> 7) & 0x7FF ) + 17;
iReg &= ~(0x7FF << 7);
iReg |= (iTemp << 7);
h、用C语言给一个寄存器bit7~bit17赋值937,同时给bit21~bit25赋值17,其他位不受影响。
unsigned int iReg = 0xAA55AA55;
iReg = iReg & (~(0x7FF << 7)) & (~(0x1F << 21));
iReg = iReg | (937 << 7) | (17 << 21);
9、技术升级:用宏定义来完成位运算
a.直接用宏来置位、复位(最右边为第一位)
置位:#define SET_NTH_BIT(x,n) (x | ((1U) << (n-1)))
#define SET_NTH_MTH_BIT(x, n, m) (x | ((~(~(0U) << (m-n+1))) << (n-1)))
复位:#define RESET_NTH_BIT(x,n) x & (~((1U) << (n-1)))
b.截取变量的部分连续值,如:变量0x88,也就是0b10001000,若截取第2~4,则值为100b = 4
关键点是如何获取(m-n+1)个1-------> (~(~(0U) << (m-n+1))))
#define GETBITS(x,n,m) ((x >> (n-1)) & (~(~(0U) << (m-n+1))))
或:#define GETBITS(x,n,m) ((x & ((~(~(0U) << (m-n+1))) << (n-1))) >> (n-1))