【问题标题】:why -3==~2 in C#为什么 -3==~2 在 C#
【发布时间】:2011-05-27 04:31:45
【问题描述】:

无法理解。为什么输出“相等”

代码:

 if (-3 == ~2)           
    Console.WriteLine("equal");
 else
    Console.WriteLine("not equal");

输出:

equal

【问题讨论】:

标签: c# .net conditional-statements bitwise-operators twos-complement


【解决方案1】:

因为two's complement bit-arithmetic 做到了

从维基百科页面抄袭并扩展:

Most
Significant
Bit          6  5  4  3  2  1  0   Value
0            0  0  0  0  0  1  1   3
0            0  0  0  0  0  1  0   2
0            0  0  0  0  0  0  1   1 
0            0  0  0  0  0  0  0   0
1            1  1  1  1  1  1  1   -1
1            1  1  1  1  1  1  0   -2
1            1  1  1  1  1  0  1   -3
1            1  1  1  1  1  0  0   -4

所以你得到:

0  0  0  0  0  0  1  0  =  2
1  1  1  1  1  1  0  1  = -3

如您所见,所有位都被翻转,这就是 bitwise NOT operator (~) 所做的。

【讨论】:

  • 对于那些对负数为何以这种方式表示感到好奇的人,请尝试将 -1 与 1 相加,看看您是如何得到零的 :-)
【解决方案2】:

这篇 stackoverflow 帖子解释了原因:

What is the tilde (~) in the enum definition?

是一元补码运算符——它翻转其操作数的位。 在二进制补码算术中,~x == -x-1

【讨论】:

    【解决方案3】:

    这是由于有符号整数的二进制补码表示:http://en.wikipedia.org/wiki/Twos_complement

    【讨论】:

      【解决方案4】:

      因为它使用二进制补码。

      【讨论】:

        【解决方案5】:

        这两个运算符有很大的不同。

        "~ 运算符按位执行 对其操作数进行补运算, 这具有颠倒每个 少量。位补运算符是 为 int、uint、long 和 乌龙。”

        msdn

        【讨论】:

          【解决方案6】:

          3 的补码是:

          1...1101

          2 的(有符号的)反码是:

          1...1101

          这很容易做到:

          一个补码:翻转位。 二进制补码:一个补码 + 1。

          为什么这很有用?计算机可以通过简单的位翻转和加法来减去数字。

          【讨论】:

            猜你喜欢
            • 2010-10-02
            • 2013-08-22
            • 2020-01-23
            • 2016-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多