zoukankan      html  css  js  c++  java
  • 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>  
  • 相关阅读:
    shell-3
    shell-2
    shell-1
    zabbix监控top
    django指导网址
    文件下载漏洞
    Build a Raspberry Pi powered live train station sign for your desk
    Use a Raspberry Pi to communicate with Amazon AWS IoT
    Describing and Listing Your Stacks
    固有功能参考 Intrinsic Function Reference
  • 原文地址:https://www.cnblogs.com/ywsoftware/p/3707113.html
Copyright © 2011-2022 走看看