C語言之位元運算

來源:互聯網
上載者:User

標籤:移動   個數   奇數   還原   變數   nbsp   bsp   原碼   異或   

位元運算1).定義.

   指的是1個位元據的每一位來參與運算.

   位元運算的前提: 是這個數必須是1個二進位.

 

   注意:

               a). 參與位元運算的位元據必須是補碼形式.

               b). 位元運算的結果也是二進位的補碼形式.

 2).按位與: &

    參與按位與的兩個位元.如果都為1 那麼結果就為1 只要有1位為0 那麼結果就為0.

 

    3 & 2;

    第1步驟:先得到兩個數的二進位補碼形式.

 

    3的補碼: 00000000 00000000 00000000 00000011

    2的補碼: 00000000 00000000 00000000 00000010

                          -------------------------------------------------------

            00000000 00000000 00000000 00000010   2

 

   

    -3 & 4;

   

    -3的原碼:10000000 00000000 00000000 00000011

    -3的反碼:11111111 11111111 11111111 11111100

    -3的補碼:11111111 11111111 11111111 11111101

    4的補碼: 00000000 00000000 00000000 00000100

                          ------------------------------------------------------

00000000 00000000 00000000 00000100

 

    -3 & -4;

   

    -4的原碼: 10000000 00000000 00000000 00000100

    -4的反碼: 11111111 11111111 11111111 11111011

 

    -3的補碼:11111111 11111111 11111111 11111101

    -4的補碼:11111111 11111111 11111111 11111100

             -----------------------------------------------------

             11111111 11111111 11111111 11111100

    結果是補碼: 現將其還原為反碼

 

      反碼:      11111111 11111111 11111111 11111011

      原碼:      10000000 00000000 00000000 00000100

   

注意:

任何數按位與1的結果是:是這個數的最低位.

 

    10 & 1

    xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0

    00000000 00000000 00000000 00000001

    ------------------------------------

    00000000 00000000 00000000 00000000

 

    偶數的最低位一定是0. 奇數的最低為一定是1

    所以,如果要判斷這個數是奇數還是偶數 只要用這個數按位與1就可以了.

   

    如果結果為1 那麼就是奇數 如果結果為0 那麼結果就是偶數.

 

    int num = 10;

    if((num & 1) == 0)

    {

        偶數.

    }

    else

    {

        奇數.

    }

 3). 按位或. |

    參與按位或的位元據 只要有1位是1 那麼結果就為1  只有當兩位都是0的時候結果才為0

 

    3 | 2;

 

     3的補碼: 00000000 00000000 00000000 00000011

     2的補碼: 00000000 00000000 00000000 00000010

                           ------------------------------------------------------

              00000000 00000000 00000000 00000011

 

    -3 | 4

 

     -3的補碼:11111111 11111111 11111111 11111101

     4的補碼: 00000000 00000000 00000000 00000100

                   ------------------------------------------------------

              11111111 11111111 11111111 11111101

    結果是1個負數.

        反碼: 11111111 11111111 11111111 11111100

        原碼: 10000000 00000000 00000000 00000011

 

     -3 | -4

     -3的補碼:11111111 11111111 11111111 11111101

     -4的補碼:11111111 11111111 11111111 11111100

             -------------------------------------------------------

              11111111 11111111 11111111 11111101

 

 4). 按位取反: ~

    單目運算子. 將這個位元的每一位取反.

 

    ~3;

 

    3的補碼: 00000000 00000000 00000000 00000011

            11111111 11111111 11111111 11111100 補碼

            11111111 11111111 11111111 11111011 反碼

            10000000 00000000 00000000 00000100 原碼    

5). 按位異或: ^

    參與按位異或的位元據的位 如果相同則為0 不同為1.

 

   

    3 ^ 2;

 

    00000000 00000000 00000000 00000011   3的補碼

    00000000 00000000 00000000 00000010   2的補碼

    --------------------------------------

    00000000 00000000 00000000 00000001   1

   

    交換兩個變數的值可以用異或運算.

 

    int a = 3;

    int b = 2;

 

    a = a ^ b;  a = 1

    b = a ^ b;  b = 3

    a = a ^ b;  b = 2

 

    1 ^ 2

    00000000 00000000 00000000 00000001

    00000000 00000000 00000000 00000010

    -------------------------------------------------------

    00000000 00000000 00000000 00000011                      3

 

    00000000 00000000 00000000 00000001

    00000000 00000000 00000000 00000011

    ------------------------------------------------------

    00000000 00000000 00000000 00000010                      2

 6). 按位左移運算. <<

    參與按位左移運算的位元據. 向左移動指定的位元. 低位不夠補0 高位溢出就丟棄.

 

    3 << 2;

 

    00000000 00000000 00000000 00000011

    000000 00000000 00000000 0000001100

   

    12

 

    注意:

                        a). 左移運算有可能會改變其正負性.

                        b). 將1個數左移n位,相當於將這個數 乘以 2的n次方.

 

        3 << 2    3乘以2的2次方.

   

       16 << 3;   16 * 8  128

 

       5 * 16 = ????

 

       5 << 4

 

 7). 按位右移. >>

    參與按位右移的位元據.向右移動指定的位元. 低位溢出丟棄,高位補符號位.

 

    3 >> 2;

 

    00000000 00000000 00000000 00000011

    0000000000 00000000 00000000 000000

 

    16 >> 2;

 

    00000000 00000000 00000000 00010000

      00000000 00000000 00000000 000100

 

    -16 >> 3

 

    10000000 00000000 00000000 00010000

    11111111 11111111 11111111 11101111

    11111111 11111111 11111111 11110000

 

    11111111111 11111111 11111111 11110

    11111111111 11111111 11111111 11101 反碼

    10000000000 00000000 00000000 00010

   

注意.

             a). 右移運算不會改變正負性.

             b). 1個數按位右移n位.相當於這個數除以2的n次方.

 

    100 >> 2  相當於 100 / 4

 

C語言之位元運算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.