Welcome to HoweLei's Zone!

我们需要每天都进步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

【原创】C# 中~操作符的理解

Posted on 2006-12-20 16:51  小肥磊  阅读(700)  评论(1)    收藏  举报
先看代码:
 1using System;
 2namespace 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}

运行结果:
~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。
 
总结:对应位运算的操作,一定要对数在计算机中存储的方式,以及原码、补码和反码的关系理解清楚了,才能更好的理解位运算操作,得到正确的结果。