先看代码:
运行结果:
~2 := -3 ~-2 := 1
结果是怎么得到的呢?
MSDN中解释如下: ~ 运算符对操作数执行按位求补操作。
好,我们一步一步来看:
1.int型2在机器中的二进制表示为:
2 0000 0000 0000 0000 0000 0000 0000 0010
2.~2按照MSDN中解释按位求补为:
~2 1111 1111 1111 1111 1111 1111 1111 1101
3.1111 1111 1111 1111 1111 1111 1111 1101 转换成十进制是多少呢?这里很多人都不会认为是-3,因为大多人的理解
-3的二进制应该是 1000 0000 0000 0000 0000 0000 0000 0011。
其实这是错误的,在计算机中负数是通过补码形式存在的,刚刚我们想到的二进制形式只是该负数的原码。
怎样得到负数补码呢?负数补码是在反码上加1。
因此: -3原码 1000 0000 0000 0000 0000 0000 0000 0011
反码 1111 1111 1111 1111 1111 1111 1111 1100
+1 1111 1111 1111 1111 1111 1111 1111 1101
所以~2的结果就是-3了。
另外,如果我们知道一个负数的补码如何得到其原码呢?也是补码的反码加1。
因此:
补码 1111 1111 1111 1111 1111 1111 1111 1101
反码 1000 0000 0000 0000 0000 0000 0000 0010
+1 1000 0000 0000 0000 0000 0000 0000 0011
其结果就是-3。
~-2 = 1 过程如下:
-2原码 1000 0000 0000 0000 0000 0000 0000 0010
-2反码 1111 1111 1111 1111 1111 1111 1111 1101
-2补码 1111 1111 1111 1111 1111 1111 1111 1110
~-2 0000 0000 0000 0000 0000 0000 0000 0001
正数的补码就是其原码,
因此 0000 0000 0000 0000 0000 0000 0000 0001就是1,也就是~-2 = 1。
总结:对应位运算的操作,一定要对数在计算机中存储的方式,以及原码、补码和反码的关系理解清楚了,才能更好的理解位运算操作,得到正确的结果。
1
using System;
2
namespace ConsoleApplication1
3
{
4
class Class1
5
{
6
[STAThread]
7
static void Main(string[] args)
8
{
9
Console.WriteLine("~2 := {0}",~2);
10
Console.WriteLine("~-2 := {0}",~-2);
11
}
12
}
13
}
using System;2
namespace ConsoleApplication13
{4
class Class15
{6
[STAThread]7
static void Main(string[] args)8
{9
Console.WriteLine("~2 := {0}",~2);10
Console.WriteLine("~-2 := {0}",~-2);11
}12
}13
}运行结果:
~2 := -3 ~-2 := 1
结果是怎么得到的呢?
MSDN中解释如下: ~ 运算符对操作数执行按位求补操作。
好,我们一步一步来看:
1.int型2在机器中的二进制表示为:
2 0000 0000 0000 0000 0000 0000 0000 0010
2.~2按照MSDN中解释按位求补为:
~2 1111 1111 1111 1111 1111 1111 1111 1101
3.1111 1111 1111 1111 1111 1111 1111 1101 转换成十进制是多少呢?这里很多人都不会认为是-3,因为大多人的理解
-3的二进制应该是 1000 0000 0000 0000 0000 0000 0000 0011。
其实这是错误的,在计算机中负数是通过补码形式存在的,刚刚我们想到的二进制形式只是该负数的原码。
怎样得到负数补码呢?负数补码是在反码上加1。
因此: -3原码 1000 0000 0000 0000 0000 0000 0000 0011
反码 1111 1111 1111 1111 1111 1111 1111 1100
+1 1111 1111 1111 1111 1111 1111 1111 1101
所以~2的结果就是-3了。
另外,如果我们知道一个负数的补码如何得到其原码呢?也是补码的反码加1。
因此:
补码 1111 1111 1111 1111 1111 1111 1111 1101
反码 1000 0000 0000 0000 0000 0000 0000 0010
+1 1000 0000 0000 0000 0000 0000 0000 0011
其结果就是-3。
~-2 = 1 过程如下:
-2原码 1000 0000 0000 0000 0000 0000 0000 0010
-2反码 1111 1111 1111 1111 1111 1111 1111 1101
-2补码 1111 1111 1111 1111 1111 1111 1111 1110
~-2 0000 0000 0000 0000 0000 0000 0000 0001
正数的补码就是其原码,
因此 0000 0000 0000 0000 0000 0000 0000 0001就是1,也就是~-2 = 1。
总结:对应位运算的操作,一定要对数在计算机中存储的方式,以及原码、补码和反码的关系理解清楚了,才能更好的理解位运算操作,得到正确的结果。


浙公网安备 33010602011771号