3、如何用位运算构建特定的二进制数
1、寄存器位操作经常需要特定位给特定值
对寄存器特定位置1或清0或取反
2、解法1:使用工具软件或计算器直接计算给出。
优势:可以完成工作,难度也不大
劣势:依赖工具,不直观,读程序的人不容易理解
解法2:自己写代码用位操作符号
3、使用移位获取特定位为1的二进制数
1、最简单的就是用移位来获取一个特定位为1的二进制数
譬如:bit3-bit7为1 (隐含意思就是其他位全部为0)可以这样(0x1f<<3)
bit3-bit7为1 并且 bit23~bit25 位为1 ((0x1f<<3)| (7<<23))
int main(void)
{
unsigned int a;
// 下面表达式含义: 位或说明数字由两部分构成:
a = ((0x1f<<3)|(7<<23));
printf("a = 0x%x.\n", a);
}
4、在结合取反获取特定位为0的二进制数
1、利用上面的方法,譬如获取bit4-bit10为0,其余全部为1的数,怎么做?
2、利用上面讲的方法就可以:((0xf << 0)|(0x1fffff << 11))
int main(void)
{
unsigned int a;
// 下面表达式含义: 位或说明数字由两部分构成:
a = ((0xf << 0)|(0x1fffff << 11));
printf("a = 0x%x.\n", a);
}
但是问题是:连续为1的位数太多了,这个数字本身就很难构造,所以这种方法的优势损失掉了。
3、这种特定位(比较少)为0而其余位(大部分)为1的数,不适合用很多歌连续1左移方式构造,适合
左移加位取反的方式来构造。
4、思路是:
int main(void)
{
unsigned int a;
// 下面表达式含义: 位或说明数字由两部分构成:
a = ~(0x7f << 4); //算法的优越性
printf("a = 0x%x.\n", a);
}
5、总结:位与、位或结合特定二进制数即可完成寄存器位操作需求
1、如果你要的这个数比较少为1,大部分为0,则可以通过连续很多歌1左移n位得到。
2、如果你要的这个数比较少为0,大部分为1,则可以通过连续很多歌1左移n位取反得到。
3、如果你想要的数中连续1(连续0)的部分不止1个,那么可以通过多段分别构造,然后再彼此位与即可。这时候因为参与位或运算的个数为1是不重复的。这时候可以几个数叠加。
4、位运算实战演练
口诀:置位要用1,
1、a = a | ( 1<<3 )
2、a = a | ( 0x1f <<3 );
int main(void)
{
unsigned int a;
a = 0;
a |= (0b11111 << 3);
printf("a = 0x%x.\n");
}
3、给定一个整型数a,清除a的bit15,保持其他位不变。
a = a & (~( 1 << 15 ));
int main(void)
{
unsigned int a;
a = 0xffffffff;
a = a & (~(1 << 15));
printf("a = 0x%x.\n");
}
4、 a = a & (~( 0x1ff << 15 ));
5、给定一个整型数a,取出a的bit3~bit8。
第一步:先将bit3-bit8不变,其余全部清零。在将右移3位得到结果
int main(void)
{
unsigned int a;
a = 0xc30288f8;
//第一步:先将bit3-bit8不变,其余全部清零
a = a & ((0x3f<<3));
//将其右移3位
a >>= 3;
printf("a = %u.\n");
}
6、用 C语言给bit7-bit17 赋值937(其余位不受影响)
关键点:
1、不影响其他位
2、你并不知道原来bit7-bit17中的值
思路:
1、先将bit7-bit17全部清零
2、再将937写入bit7-bit17.
a &= ~(0x7ff << 7);
a |= (937 <<7);
7、用C语言将一个寄存器中的bit7-bit17中的值加17 (其余位不受影响)
关键点:不知道原来的值为多少
思路:第一步:先读出原来bit7-bit17的值
第二步:给这个值加17;
第三步:将bit7-bit17清零
第四步:将第二步计算出来的值写入bit7-bit17中的值
int main(void)
{
unsigned int a,tmp;
a = 0xc30288f8;
//第一步:先将bit3-bit8不变,其余全部清零
tmp = a & ((0x3ff<<7));
tmp >>= 7;
tmp += 17 ;
a &= ~(0x3ff<<7);
a |= tmp <<7;
//将其右移3位
a >>= 3;
printf("a = %u.\n");
}
位操作笔记
最新推荐文章于 2024-09-05 00:19:10 发布