C# 位運算

在C#中能夠對整型運算對象按位進行邏輯運算。按位進行邏輯運算的意義是:依次取被運算對象的每一個位,進行邏輯運算,每一個位的邏輯運算結果是結果值的每一個位。html

 

C# 中支持的位操做符號有:spa

 

運算符號
意義
運算對象類型
運算結果類型
對象數
實例
~
按位取反運算
整型,字符型
整型
1
~a
&
位邏輯 運算
2
a & b
|
位邏輯 運算
2
a | b
^
位邏輯 異或運算
2
a ^ b
<<
左移運算
2
a<<4
>>
右移運算
2
a>>2

 

下面詳細介紹每一個位運算的操做。.net

 

1. 按位取反操做 ~

按位取反操做會將整個變量的全部位都進行取反,包括符號位。code

[html]  view plain copy
 
  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.    }  


 

輸出爲:xml

-6htm

4對象

 

舉例:  在C#中int 類型佔4個字節, 5 的二進制碼爲:blog

[html]  view plain copy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0101  


 

按位取反後的二進制碼爲:ip

[html]  view plain copy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1010  


 

這個二進制碼對應內存中存儲的補碼,讓這個二進制碼減去1,獲得表示數字的反碼:內存

[html]  view plain copy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1001  


由這個反碼便可得到源碼,請注意,最左邊的爲符號位,在活的原碼的時候符號位不取反:

[html]  view plain copy
 
  1. 1000 0000 0000 0000 0000 0000 0000 0110  


 

這個數在內存中即爲 -6。

 

一樣,-5在內存中的原碼爲:

[html]  view plain copy
 
  1. 1000 0000 0000 0000 0000 0000 0000 0101  

得到反反碼爲:

[html]  view plain copy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1010  


補碼爲:

[html]  view plain copy
 
  1. 1111 1111 1111 1111 1111 1111 1111 1011  


這個補碼按位取反之後爲:

[html]  view plain copy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0100  

在內存中即爲 4.

 


二、位邏輯與運算 &

注意:符號位一樣參加按位與操做。

位邏輯與運算將兩個運算對象按位進行與運算。與運算的規則:1與1等於1,1與0等於0。 
好比:10010001(二進制)&11110000等於10010000(二進制)。
[html]  view plain copy
 
  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 plain copy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0001  


b 爲:

[html]  view plain copy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0010  


按位與之後爲:

[html]  view plain copy
 
  1. 0000 0000 0000 0000 0000 0000 0000 0000  

 

下面舉例當符號位參與操做的狀況:

 

[html]  view plain copy
 
  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 plain copy
 
    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>三、</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>四、位邏輯異或運算 ^</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>五、位左移運算 <<</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>六、位右移運算 >></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>
相關文章
相關標籤/搜索