C++位運算


①.  將數字的第x位置1(注意是從0開始記位數的)

      a |= 1 << x

②. 將數字的第x位置0

      a &= ~(1 << x)

③.  計算一個數字有多少個1

      int n = 0;

      do

        ++n;

      while(0 == (x = x&(x-1)) );

 

④.  判斷一個數是否是2的冪

    即判斷一次 n & (n - 1) == 0

⑤.  判斷一個數是否被2整除也可以用位運算的方法

    n & 1 == 0 ? "可以被2整除" : "不能被2整除" ;

⑥. 交換兩個數                 |     交換也可以用指針或值引用       

    void swap(int *a, int *b)        |     void swap(int *a, int *b)       

    {                 |     {               

      *a = *a ^ *b;          |        int temp = *a; 

      *b = *a ^ *b;          |        *a = *b;           

      *a = *a ^ *b;          |        *b = temp;    

    }                 |     }         

    也可以用宏定義,不過每行末必須加\

    #define swap(a, b)      \

    {              \

       int temp = a;      \

       a = b;         \

       b = a;         \

    }

⑦. 高8位與低8位交換

    int val = 0x5678;

    int res = (0x00ff & val) << 8 | (val >> 8);       // res = 0x7856;

⑧. 實現16位二進制的逆序(更多位思路相仿)

    思路:

    例:1001 0010 0101 0001-》0x9251 交換后應為 1000 1010 0100 1001 -》0x8A49

    相鄰兩位進行交換  

          int val = 0x9251;

          unsigned int res1 = (val & 0xaaaa) >> 1;

          unsigned int res2 = (val & 0x5555) << 1;

          val = res1 | res2;

     每兩位進行交換

          res1 = (val & 0xcccc) >> 2;

          res2 = (val & 0x3333) << 2;

          val = res1 | res2;

     每四位進行交換

          res1 = (val & 0xf0f0) >> 4;

          res2 = (val & 0x0f0f) << 4;

          val = res1 | res2;

   將高8位與低8位交換

          res1 = (val & 0xff00) >> 8;

          res2 = (val & 0x00ff) << 8;

          val = res1 | res2;

⑨. 利用位運算替換加法

     void binadd(int x, int  y)

     {

      int x1 = x, y1 = y;

      while(y1 != 0)

      {  

        int tmp = x1 ^ y1;

        y1 = (tmp & y1) << 1;

        x1 = tmp;

      }

      return x1;

    }

⑩. 從一個數組中找出唯一出現一次的數,復雜度為O(n),方法之一是通過位運算 

      挨個異或,結果則是那個數       

①①. 數組中只有兩個數出現的次數為單數,從數組中找出這兩個數 

      例:int a[] = {5, 19, 2, 8, 7, 8, 2, 6, 19, 5},這兩個數為6, 7,

      int a[] = {5, 19, 2, 8, 7, 8, 2, 6, 19, 5};
         int m =0, n = 0;
         int r = 0, i = 0;
           int bit = 0;
     
         for(i = 0; i < sizeof(a)/sizeof(int); i++)
         {
              r = r ^ a[i];
         }
         
         for(bit = 31; bit >= 0 ; bit--)
         {
             if(r & (1 << bit))
                break;
         }
     
         for(i = 0; i < sizeof(a)/sizeof(int); i++)
         {
              if(a[i] & (1 << bit))
                  n = n ^ a[i];
              else
                    m = m ^ a[i];
         }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM