c高级之---位操作

1 位操作符
位与&:
位或|:
位取反~:操作数的二进制位逐个取反


逻辑取反!:真(非0)-->假(0),假(0)-->真(1):一个非零数逻辑取反两次一定等于1


位异或^:1^1=0^0=0;1^0=0^1=1.异或:相异就或操作。


左位移与右位移:
对于无符号数,左移与右移时都是另一侧补0(相当于逻辑移位)
对于有符号数:左移时右侧补0 (算术移位,相当于逻辑位移)
     右移时左侧补符号位(算术移位):正数补0,负数补1
嵌入式中都是无符号数!!!!!
2 *寄存器按位进行规划和使用:
*ARM是内存与IO统一编址的,ARM很多内部外设,Soc中CPU通过向这些内部外设的寄存器写入特定的值,间接操控硬件动作--读写寄存器就是操控硬件


*寄存器操作要求:设定特定位时,不能影响其他位。
     具体方法:读-改-写三部曲:改变寄存器特定位时,不直接写,先读出寄存器原先整体值--->修改特定位-->修改值整体写入寄存器。


3 特定位清0用&0


特定位置1用|1


特定位取反用^1


*a使用移位获取特定位为1的二进制数:获取bit3~bit7为1,同时bit23~bit25为1的二进制数:((0x1f<<3)|(0x7<<23))


*b结合位取反获取特定位为0的二进制数:获取bit4~bit10为0,其余位为1:a可用(0xf<<0)|(0x1fffff<<11)--效果不好
这种特定位比较少(本例为0)的数,可以用左移+位取反来构造:思路-构造这个数的位相反数,在取反得到这个数:b可以~(0x7f<<4)


给定一个整型数a,取出a的bit3~bit8。第一步将除bit3~bit8之外的置0.第二步将处理后的数向右移3位

*c用c语言给一个寄存器的bit7~bit17赋值937(其余位不受影响):
             1将bit7~bit17全部清零:a&=~(0x7ff<<7)
    2将bit7~bit!7赋值937:a|=(937<<7)


*d用C语言给一个寄存器的bit7~bit17加上17(其余位不受影响)
    1读出原来bit7~bit17的值:tmp=a&(0x7ff<<7),tmp>>=7
    2给这个值加17:tmp+=17
    3将bit7~bit17清零:a&=~(0x7ff<<7)
    4将2步值写入bit7~bit17:a|=(tmp<<7)


*e宏定义:直接用宏来置位(置1),复位(清0)。
用宏定义将32位数X的第n位(右边起算,bit0为第一位)置位:#define SET_BIT_N(x,n)  (x|(1U<<(n-1)))


        用宏定义将32位数X的第n位(右边起算,bit0为第一位)清零:#define CLEAR_BIT_N(x,n) (x&~(1u<<(n-1)))


用宏定义将32位数X的第n位到第m位(右边起算,bit0为第一位,m为高位)置位:
#define SET_BIT_N(x,n,m)  (x|a<<(n-1)))
a=(m-n+1)个1的十六进制形式):第一步得到32位1-- ~0u. 第二步将第一步数右移x位得到(m-1+1)个1:(~0u)>>(32-(m-1+1))


截取变量的部分连续位:
截取变量x的第n到m位:((x&~(~(0u)<<(m-n+1))<<(n-1))>>(n-1))

猜你喜欢

转载自blog.csdn.net/qq_32809273/article/details/53106766