——取反:与1异或^(或整体取反用~) 置1:与1位于| 清0:与0位于&
——左移《 右移》
——获取bit3~bit7为1,同时bit23~bit25为1,其余位为0的数:((0x1f<<3) | (7<<23))
——获取bit4~bit10为0,其余位全部为1的数:~(0x7f<<4)
---给定一个整型数a,设置a的bit3,保证其他位不变。
a = a | (1<<3) 或者 a |= (1<<3)
---给定一个整形数a,设置a的bit3~bit7,保持其他位不变。
a = a | (0b11111<<3) 或者 a |= (0x1f<<3);
---给定一个整型数a,清除a的bit15,保证其他位不变。
a = a & (~(1<<15)); 或者 a &= (~(1<<15));
---、给定一个整形数a,清除a的bit15~bit23和bit23~bit29,保持其他位不变。
a = a & (~(0x1ff<<15|0x7f<<23)); 或者 a &= (~(0x1ff<<15|0x7f<<23));
---给定一个整形数a,取出a的bit3~bit8。
思路:
第一步:先将这个数bit3~bit8不变,其余位全部清零。
第二步,再将其右移3位得到结果。
第三步,想明白了上面的2步算法,再将其转为C语言实现即可。
a &= (0x3f<<3);
a >>= 3;
----用C语言给一个寄存器的bit7~bit17赋值937(其余位不受影响)。
思路:第一步,先将bit7~bit17全部清零,当然不能影响其他位。
第二步,再将937写入bit7~bit17即可,当然不能影响其他位。
a &= ~(0x7ff<<7);
a |= (937<<7);
---直接用宏来置位、复位(最右边为第1位)。
#define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1))) //将32位数x的第n位复位,1U是 指1是无符号数(是有好处的,无符 号数左移右移都补0,有符号数的负数左移时补1)
#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1))) //将32位数的第n位清零
--- 将32位数x从第n位到底m位复位
第一步需要得到一个m-n+1个1的数:(~(0U)>>(32-(m-n+1)))
第2步将得到的数左移n-1位和x取或
#define SET_NTH_BIT(x, n,m) (x |( (~(0U)>>(32-(m-n+1))<<(n-1))))