7

我需要做一个逆计算,包括按位与运算,我该怎么做?

我尝试了异或,但没有帮助。

        int i = 254 & 2;
        Console.Write("254 & 2 ={0}", i + "\n");
        Console.Write("{0} ^ 2 ={1}",i, (i ^ 2) + "\n");

不工作。我该如何计算?

4

6 回答 6

30

给定i的,你不能回来254。通过&ing 它,您已经破坏了未存储在第二位中的数据。

 1111 1110
&0000 0010
----------
 0000 0010

您将如何恢复丢失的 6 个位?因为x & 2 == 2,你几乎可以放任何x东西,这将是真的。

 0010 1010 // = 42
&0000 0010
----------
 0000 0010

x254 还是 42?你说不出来。

于 2009-04-23T19:49:28.853 回答
22

从技术上讲,AND 的对立面是 NAND:

~( 254 & 2 )

请注意,~ 是补码运算符,并且按位 NOT(将每个位切换到相反的位置)。

不过,你到底想要什么?你想达到什么目的?

如果您试图撤消计算,则不能 - 没有逆函数使得 inverseand(and(x, y)) 将返回 x 或 y,即使 inverse 给出其中之一。

-亚当

于 2009-04-23T19:49:46.980 回答
3

你不能,你已经丢失了执行 & 时的数据。

4 位示例:

1110 & 0010 = 0010

如果您只知道结果 0010 和 & 的第二个操作数(也是 0010),您将无法知道哪些位是 1,哪些不是。

于 2009-04-23T19:49:07.623 回答
1

Wikipedia 有一篇关于位运算的好文章,它们如何工作以及它们在 C 和 Java 中的语法,这与 C# 非常相似

http://en.wikipedia.org/wiki/Bitwise_operation

MSDN 当然也有每个位和逻辑运算符的文档,每个运算符都有一个示例:

http://msdn.microsoft.com/en-us/library/6a71f45d(vs.71).aspx

于 2009-04-23T19:55:44.360 回答
0

反向计算是什么意思?

如果您将数字 254 视为由 8 位组成的位寄存器,则除最后一位之外的所有位都设置为 1。

计算 254 & 2 与检查寄存器中的第 2 位是否设置相同。

与此相反的是什么?检查是否设置了所有其他位?

于 2009-04-23T19:59:01.700 回答
0

如果&操作的目的是检查是否设置了位 1,则潜在的“相反”操作是“设置位 1”。

IE:

val = val | 2;

这会覆盖当前位 2 中的值,并且不会触及任何其他位。

如果字节中的 8 位被认为是完全独立的位,那么可以通过触摸任何其他位来更改其中的任何位。

在这种情况下,丢失一些原始信息并不重要。我们实际上并不关心其他位具有什么值,并且通常在使用位掩码时,所讨论的位的原始值无论如何都是零。

于 2009-04-26T08:50:44.467 回答