C# 位运算

在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。

 

C# 中支持的位操作符号有:

 

运算符号
意义
运算对象类型
运算结果类型
对象数
实例
~
按位取反运算
整型,字符型
整型
1
~a
&
位逻辑运算
2
a & b
|
位逻辑运算
2
a | b
^
位逻辑异或运算
2
a ^ b
<<
左移运算
2
a<<4
>>
右移运算
2
a>>2

 

下面详细介绍每个位运算的操作。

 

1. 按位取反操作 ~

按位取反操作会将整个变量的所有位都进行取反,包括符号位。

[html] view plaincopy
 
  1. class Program  
  2.    {  
  3.        static void Main(string[] args)  
  4.        {  
  5.            int number = 5;  
  6.            number = ~number;  
  7.            Console.WriteLine(number);  
  8.   
  9.            int k = -5;  
  10.            number = ~k;  
  11.            Console.WriteLine(number);  
  12.        }  
  13.    }  


 

输出为:

-6

4

 

举例:  在C#中int 类型占4个字节, 5 的二进制码为:

[html] view plaincopy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0101  


 

按位取反后的二进制码为:

[html] view plaincopy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1010  


 

这个二进制码对应内存中存储的补码,让这个二进制码减去1,得到表示数字的反码:

[html] view plaincopy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1001  


由这个反码即可获得源码,请注意,最左边的为符号位,在活的原码的时候符号位不取反:

[html] view plaincopy
 
  1. 1000 0000 0000 0000 0000 0000 0000 0110  


 

这个数在内存中即为 -6。

 

同样,-5在内存中的原码为:

[html] view plaincopy
 
  1. 1000 0000 0000 0000 0000 0000 0000 0101  

获得反反码为:

[html] view plaincopy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1010  


补码为:

[html] view plaincopy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1011  


这个补码按位取反以后为:

[html] view plaincopy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0100  

在内存中即为 4.

 


2、位逻辑与运算 &

注意:符号位同样参加按位与操作。

位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 
比如:10010001(二进制)&11110000等于10010000(二进制)。
[html] view plaincopy
 
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         int a = 1;  
  6.         int b = 2;  
  7.         int c = a & b;  
  8.         Console.WriteLine(c);  
  9.     }  
  10. }  


 

a 为:

[html] view plaincopy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0001  


b 为:

[html] view plaincopy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0010  


按位与以后为:

[html] view plaincopy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0000  

 

下面举例当符号位参与操作的情况:

 

[html] view plaincopy
 
  1. static void Main(string[] args)  
  2. {  
  3.     int a = -2147483647;  
  4.     int b = 1;  
  5.     int c = a & b;  
  6.     Console.WriteLine(c);  
  7. }  


a:

[html] view plaincopy
 
    1. <pre class="html" name="code">1000 0000 0000 0000 0000 0000 0000 0001</pre>  
    2. <pre></pre>  
    3. <p>a的原码为:</p>  
    4. <pre class="html" name="code">1111 1111 1111 1111 1111 1111 1111 1111</pre>  
    5. <p><br>  
    6. b的二进制:</p>  
    7. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>  
    8. <p><br>  
    9. 按位与以后还是:</p>  
    10. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>  
    11. <h1 class="html" name="code"><a name="t4"></a><br>  
    12. <br>  
    13. <strong><span>3、</span>位逻辑或运算</strong><span> |</span></h1>  
    14. <p class="html" name="code"><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>  
    15. <div>位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,</div>  
    16. <div>0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。</div>  
    17. <div> </div>  
    18. <div><pre class="html" name="code">    class Program  
    19.     {  
    20.         static void Main(string[] args)  
    21.         {  
    22.             int a = 1;  
    23.             int b = 2;  
    24.             int c = a | b;  
    25.             Console.WriteLine(c);  
    26.         }  
    27.     }</pre><br>  
    28. <p>a 为:</p>  
    29. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>  
    30. <p><br>  
    31. b 为:</p>  
    32. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0010</pre>  
    33. <p><br>  
    34. 按位与以后为:</p>  
    35. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0000</pre>  
    36. <p>a 为:</p>  
    37. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>  
    38. <p><br>  
    39. b 为:</p>  
    40. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0010</pre>  
    41. <p><br>  
    42. 按位或以后为:</p>  
    43. <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0011</pre></div>  
    44. <p> </p>  
    45. <h1><a name="t5"></a><strong>4、位逻辑异或运算 ^</strong></h1>  
    46. <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>  
    47. <div>位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,</div>  
    48. <div>1异或0等于1,0异或0等于0。即:相同得0,相异得1。</div>  
    49. <div>比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。</div>  
    50. <h1><a name="t6"></a> </h1>  
    51. <h1><a name="t7"></a>5、位左移运算 <<</h1>  
    52. <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>  
    53. <div>位左移运算将整个数按位左移若干位,左移后空出的部分0。比如:8位的byte型变量</div>  
    54. <div>byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。</div>  
    55. <div> </div>  
    56. <div><pre class="html" name="code">        static void Main(string[] args)  
    57.         {  
    58.             int a = -2147483647;  
    59.             a = a << 2;  
    60.             Console.WriteLine(a);  
    61.         }</pre><br>  
    62. </div>  
    63. <div>a 的二进制:</div>  
    64. <div><pre class="html" name="code"><pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0100  
    65. </pre>  
    66. <pre></pre>  
    67. 左移两位以后,符号位丢失:  
    68. <pre></pre>  
    69. </pre></div>  
    70. <div> </div>  
    71. <div><pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0100</pre>即为4.<br>  
    72. </div>  
    73. <div> </div>  
    74. <div> </div>  
    75. <h1><a name="t8"></a>6、位右移运算 >></h1>  
    76. <p> </p>  
    77. <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>  
    78. <div>位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量</div>  
    79. <div>Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。</div>  
    80. <p> </p>  
    81. <p> </p>  
    82. <p> </p>  
    83. <p> </p>  
    84. <pre></pre>  
posted @ 2014-05-04 15:24  于为  阅读(329)  评论(0编辑  收藏  举报