位操作笔记

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"); 
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小相619

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值