这个问题看起来很合理
我有一个只实现AND,XOR,SHL和SHR的虚拟机,但我必须执行“OR 0x01”操作。
答案 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 law:A or B = not(not A and not B)
。您可以通过XORing计算not
全部1位。