位操作

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))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值