天天看點

C語言----位運算(進階篇二十六)

  作用

    在小記憶體時代,經常把一個位元組分成好幾份來用,以達到節約記憶體的目的。

    現在經常用于網絡資料傳輸,單片機領域……。

    

    注意:

      ※在進行任何位運算前,首先應将進任何表達式的結果轉換成二進制,算完以後再轉回原來的進制即可得到結果。

      ※不能對浮點數進行位運算。

  按位與

    格式:二進制&二進制

      如:

        int a=3&5;

       

C語言----位運算(進階篇二十六)

        記憶方法:在邏輯與運算中,兩邊的表達式都為真,結果才為真。是以按位與運算時,兩個位都為1,結果才為1。

      作用:

        ※清零:要将某一位清零,可将相應的位設定為0,其它位為1,再使用&運算。

        ※取指定位:想取某一位,可将相應的位設定為1,其它位為0,再使用&運算。

  按位或

    格式:二進制|二進制

        int a=3|5;

     

C語言----位運算(進階篇二十六)

        記憶方法:在邏輯或運算中,兩邊的表達式有一個為真,結果就為真。是以按位或運算時,有一個位為1,結果就為1。

       作用:

        ※将某位置1:要将某一位置1,可将相應的位設定為1,再使用 | 運算

  按位異或

    格式:二進制^二進制

        int a=3^5;

      

C語言----位運算(進階篇二十六)

        記憶方法:“異”就是不同的意思,異或實際上是判斷兩數是否“不同”,如果不同就為真。是以按位異或時,兩數不同,結果為1。

      定理:

        1、任何數與自己異或都為0

        2、任何數與0異或值不改變

        ※翻轉位:要将某一位翻轉,可将相應的位置1,第一次用 ^ 運算,可将其翻轉,第二次用 ^ 運算,又可将其轉回來。早期的滑鼠指針用的就是一種圖形異或運算,是以速度非常快。

        ※不用臨時變量交換兩個值。如a=4,b=5,可用以下語句實作互換:

          a=a^b;

          b=b^a;

        用等量代換法分析:a=a^b,那麼b=b^a相當于b=b^(a^b),去括号得b=b^a^b,移項得b=b^b^a,根據定理1得b=0^a,根據定理2得b=a。

        這時候b的值是4,而a隻是個中間值。

        a=a^b相當于a=(a^b)^(b^a^b),去括号得a=a^b^b^a^b,移項得a=a^a^b^b^b,根據定理1得a=0^0^b,根據定理2得a=b。

        這時候a的值是5,交換完畢

      程式1

        矩陣異或

  按位取反

    格式:~二進制

      如:int a=~3;

      得到11111100,它是個負數。

  左移

    格式:二進制<<要移動的位數

    如:

      int a=3<<2;

      相當于00000011<<2得到00001100

      轉成十進制後,a的值為12

    作用:将二進制數左移一定的位數,最右邊補0。任何一位移出左邊界,自動丢棄。

    ※不越界的左移相當于讓變量值乘以2。

  右移

    格式:二進制>>要移動的位數

        int a=12>>2;

        相當于00001100>>2得到00000011

        轉成十進制後,a的值為3

    作用:将二進制數右移一定的位數,最左邊補0(或1)。任何一位移出右邊界,自動丢棄。

    ※不越界右移相當于讓變量值除以2。

    注意:右移比左移要複雜些,如果要移的數為負數,最左邊符号位為1,為了不改變此數的符号位,往右移的時候,左邊會自動補1。

    位運算的優先級:~ 高于 << >> 高于 & 高于^ 高于 |