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