交換某個整數的奇數位和偶數位,使用指令越少越好

/**spa

 * 功能:交換某個整數的奇數位和偶數位,使用指令越少越好(即,位0與位1交換,位2與位3交換,以此列推)。.net

 */get

這題要交換的是整數二進制的奇數和偶數位。it

按照通常的解題確定會對每一位分別處理,即,將整數換成二進制,而後遍歷一遍,交換奇數位和偶數位。這樣效率不高,指令也很多。而後看大題目解析,感受用位操做很棒,如下爲解題思路:class

(1)先操做奇數位,把101010(即0xAA)做爲掩碼,提取奇數位,並右移1位到偶數位置效率

(2)操做偶數位,把010101(即0x5555)做爲掩碼,提取偶數位,並左移一位到奇數位置遍歷

(3)將兩次操做結果合併成一個值。二進制

 

  1. /** 
  2.  * 思路:先操做奇數位,再操做偶數位。將數字n的奇數位右移1位,偶數位左移1位。 
  3.  * @param x 
  4.  * @return 
  5.  */  
  6. public static int swapOddEvenBits(int x){  
  7.     //奇數位右移,0xaaaa aaaa=10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101010b;  
  8.     int odd=(x&0xaaaaaaaa)>>1;  
  9.       
  10.     //偶數位左移,0x5555 5555=01010101 01010101 01010101 01010101 01010101 01010101 01010101 01010101b;  
  11.     int even=(x&0x55555555)<<1;  
  12.       
  13.     return odd|even;  

操做32位數時,掩碼用8位十六進制便可,若是是64位,就要用16位十六進制掩碼。static

 

這樣作的好處是,不須要將整數換成二進制,直接位操做返回的就是交換後的十進制整數,操做少。co

相關文章
相關標籤/搜索