为啥 -3==~2 在 C#
Posted
技术标签:
【中文标题】为啥 -3==~2 在 C#【英文标题】: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
【问题讨论】:
Why is ~3 equal to -4 in Python? 的可能重复项 How does the bitwise complement (~) operator work?的可能重复 【参考方案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】:这篇 *** 帖子解释了原因:
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。
为什么这很有用?计算机可以通过简单的位翻转和加法来减去数字。
【讨论】:
以上是关于为啥 -3==~2 在 C#的主要内容,如果未能解决你的问题,请参考以下文章