如何使用AND,XOR和shift来按位计算OR?

时间:2010-03-14 17:15:44

标签: bit-manipulation

这个问题看起来很合理

我有一个只实现AND,XOR,SHL和SHR的虚拟机,但我必须执行“OR 0x01”操作。

4 个答案:

答案 0 :(得分:6)

首先对以下两个变量进行正确的按位计算就足够了,因为它们涵盖了所有组合:
A = 0101
B = 0011

我们想要 0101
0011
A或B
0111

对于xor我们得到

0101
0011
A xor B
0110

for,我们得到

0101
0011
A和B
0001

所以,如果我们用xor连接它们,我们就完成了。

(A x或B)xor(A和B)

答案 1 :(得分:2)

我只想从

开始
a xor b = ((not a) and b) or (a and (not b))

并释放一些布尔代数,直到看起来像

a or b = <expression using only and, xor>

不可否认,这可能比实际做的更多,而不是“尝试每一个可想到的位组合”路线,但后来你确实要求提供家庭作业解决方案的想法。 :)

答案 2 :(得分:1)

在维基百科here上总结的真值表和喘气,基本的CS 101内容,De Morgan's Law ....

AND
0 & 0   0
0 & 1   0
1 & 0   0
1 & 1   1


OR
0 | 0   0
0 | 1   1
1 | 0   1
0 | 0   1


XOR
0 ^ 0   0
0 ^ 1   1
1 ^ 0   1
1 ^ 1   0

左移包括将位从右向左移位,假设:

+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|1|0|0| = 0x4 hexadecimal or 4 decimal or 100 in binary
+-+-+-+-+-+-+-+-+

Shift Left by 2 places becomes
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|0|0| = 0x10 hexadecimal or 16 decimal or 10000 in binary
+-+-+-+-+-+-+-+-+

Shift Right by 1 places becomes
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
|0|0|0|0|1|0|0|0| = 0x8 hexadecimal or 8 decimal or 1000 in binary
+-+-+-+-+-+-+-+-+

然后根据上面的真值表组合逐位操作......

答案 3 :(得分:0)

我只想展开DeMorgan's lawA or B = not(not A and not B)。您可以通过XORing计算not全部1位。