前面说到,使用位操作符去实现特定位的清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)) (置数)