个人理解—寄存器位操作 2(用位移构建特定数)

        前面说到,使用位操作符去实现特定位的清0或置1,但那样的做法还要搭配上构建出的特定数才能实现,现在来说说如何构建哪个特定的数字。(设最低位为bit0 最高位为bit31)

        构建一个Bit3-7为1的数字

首先计算Bit3-3中间有几位 7-3+1=5
5位1 也就是二进制的 1 1111
换算为16进制为1F
需要将1F左移3位
(0X1F<<3)= 0XF8
构建一个Bit23-25为1的数字
25-23+1=3为
3位1等同于二进制111
相当于十六进制的7
左移23位0X7得到构建数
(OX7<<23)= 0X380 0000

        同时实现多位位置置1操作

((0X1F)<<3 | (0X7<<23))=0X380 00F8 将上面两步同时进行使用|(位或操作)

        构建一个Bit4-7为0的数字 按照上面的思路应该在一个32位为1的数据上进行构建,但是那样太麻烦了,所有要使用~(取反)进行计算。

Bit4—10 中间有(10-4+1)=7位
7位1即111 1111
的16进制数是0X7F
(0X7F<<4)= 0X7F0 (0111 1111 0000)
~(0X7F0) = 0XFFFF FFFF FFFF F80F (F80F=1000 0000 1111)

        前文说到过,置1用|清0用&取反用^现在完成了特定数的构成,现在使用上面三种方法对数据的特定位进行改变。

设a的bit3为1  a= (a|(1<<3))

设a的bit3-7为1 a= (a|0X1F<<3)

清a的bit15位为0 a=a&(~(1<<15))

清a的bit15~23位为0(23-15+1)=9 9位1相当于0X1FF   a  = a&(~(0X1FF<<15))

取出a的bit3~8位数据(取操作前面没说过,所有下面要详细一些)

设a= 0XC30288F8
b = a 不改变a的值 所以要用新的变量
bit3~8中间有(8-3+1)=6位 6位1为0X3F
b = b&(0X3F<<3)=0XF8(1111 1000)
b = b>>3 =1F(1 1111)   (将b右移3位,把低位数据抛弃)

        设置a的bit7~17位为0X651

a = 0XC30288F8
bit17~7 有17-7+1=11位 
11位1 :111 1111 1111 = 0X7FF
首先将bit7~17清零a = a&(~(0X7FF<<7))= 1100 0011 0000 0000 0000 0000 0111 1000
对bit7~17赋值 a = a|(0X651<<7)= 1100 0011 0000 0011 0010 1000 1111 1000

       给bit7~17位的数据+0X17

a = 0XC30288F8
b = a & (0X7FF<<7) 读出7~17位数据
b = b<<7(去除低7位数据)
b = b + 0X17
a = a & ( ~ (0X7FF << 7)) (清除a的7~17位数据)
b = b<<7 (将b的位数恢复到从a取到的位数)
a = a | b

        将bit7~17赋值0X651,同时将bit21~25赋值0X17

a = a & ((0X7FF<<7)|(0X1F<<21)) (清零)
a = a | ((0X651<<7)|(0X17<<21)) (置数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值