我需要进行逆计算,其中包括按位AND运算,我该怎么做?
我尝试了异或,但没有帮助。
int i = 254 & 2;
Console.Write("254 & 2 ={0}", i + "\n");
Console.Write("{0} ^ 2 ={1}",i, (i ^ 2) + "\n");
不起作用。我该如何计算?
答案 0 :(得分:28)
鉴于i
,您无法返回254
。通过&
,你已经破坏了第二位没有存储的数据。
1111 1110
&0000 0010
----------
0000 0010
你如何恢复6个丢失的位?对于x & 2 == 2
,您几乎可以放置任何x
,这是真的。
0010 1010 // = 42
&0000 0010
----------
0000 0010
x
是254还是42?你无法分辨。
答案 1 :(得分:22)
技术上,与AND相反的是NAND:
〜(254& 2)
注意〜是补码运算符,并且按位NOT(将每个位切换到相反的位置)。
但你究竟想要什么?你想要完成什么?
如果你试图撤消计算,你不能 - 没有反函数,使得inverseand(和(x,y))将返回x或y,即使给出其中一个反函数。 / p>
- 亚当
答案 2 :(得分:3)
您不能,当您执行&。
时,您丢失了那里的数据4位示例:
1110 & 0010 = 0010
如果你只知道结果0010和&的第二个操作数,你就无法知道哪些是1和哪些不是。 (也是0010)。
答案 3 :(得分:1)
维基百科有一篇关于按位运算的文章,它们如何工作以及它们在C和Java中的语法与C#非常相似
http://en.wikipedia.org/wiki/Bitwise_operation
MSDN当然也有每个按位和逻辑运算符的文档,每个运算符都有一个例子:
http://msdn.microsoft.com/en-us/library/6a71f45d(vs.71).aspx
答案 4 :(得分:0)
相反的计算是什么意思?
如果你看到数字254是一个由8位组成的位寄存器,那么所有位都会被设置为1.
计算254& 2与检查寄存器中的位号2是否设置相同。
与此相反的是什么?检查是否设置了所有其他位?
答案 5 :(得分:0)
如果&
操作的目的是检查是否设置了位1,那么潜在的“相反”操作是“设置位1”。
即:
val = val | 2;
这会覆盖当前位2中的值,并且不会触及任何其他位。
如果字节中的8位被认为是完全独立的位,那么可以通过触摸任何其他位来改变它们中的任何一位。
在这种情况下,某些原始信息丢失并不重要。我们实际上并不关心其他位的值,并且最常使用位掩码时,所讨论的位的原始值无论如何都是零。