通过位运算修改指定bit位的值
问题样例
假如现在有一个8bit二进制数A,其可以为任何值,所以这里不妨先设A=(xxxxxxxx)2,{x|0,1}
现在需要你将A修改为A=(x111x00x)2,并且不使用任何的分支和跳转判断语句实现。
要解决这个问题我们需要用到异或、与、或三种位运算,其中异或运算是解决问题的核心。
异或运算的性质
异或运算的真值表如下
a | b | a⊕b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
上面的真值表反映出了一个规律,也是异或运算中重要的性质
- x ⊕ 0 = x
- x ⊕ 1 = !x
根据这个性质我们也可以简单地推导出异或运算的可逆性,也就是 x ⊕ y ⊕ y = x
解决过程
题目中将A修改为A=(x111x00x)2,部分位设1,部分位设0,而设1和设0需要分别来进行
第一步:指定位设1
接下来我们先要用到上文中提到的异或运算的两个性质
- x ⊕ 0 = x
- x ⊕ 1 = !x
根据这个性质构造一个新的二进制数,我们可以称它为B
构造B时我们需要将想要改变的位设1,其他不变的位设0
这一步中,我们将A=(xxxxxxxx)2修改为A=(x111xxxx)2,由此构造B=(01110000)2
接下就是见证奇迹的时刻
用C表示AB异或的结果C=A⊕B=(x [!x] [!x] [!x] xxxx)2
这时候再将AC进行或运算,A|C=([x|x] [x|!x] [x|!x] [x|!x] [x|x] [x|x] [x|x] [x|x])2=(x111xxxx)2
其实这时候你应该也可以看出来了,如果将最后的或运算改位与运算,那么就可以把指定为设定位0
第二步:指定位设0
那么我们的第二步的做法就很明显了
首先构造B=(00000110)2
再将AB进行异或C=A⊕B=(xxxxx [!x] [!x] x)2
最后AC进行与运算,A&C=([x&x] [x&x] [x&x] [x&x] [x&x] [x&!x] [x&!x] [x&x])2=(xxxxx00x)2
这样两步下来之后我们便成功将A=(xxxxxxxx)2设为了(x111xx00x)2
标签:运算,指定,修改,异或,bit,位设 From: https://www.cnblogs.com/ThousandPine/p/16833507.html本文编辑于2022年10月22日
最近修改于2022年10月27日