天天看點

整數的奇偶位互換-Java____[位運算思維]

需求

将整數的奇偶位互換

例: 9的二進制為 :1001. 交換後為 0110,即6.

  53的二進制為:110101, 交換後為 111010,即58

方法解析

二進制先隻保留偶數位存入a中, 隻保留奇數位存入b. 将隻保留偶數位的a右移(這樣就将偶數位的值移到了奇數位),同理将b左移(這樣就将所有的奇數位的值移到了偶數位).最後再将移位後的值進行異或,這樣就将移動後的奇數位和偶數位結合到了一起.

如何隻保留偶數位?

答:想要保留指定位數,隻需将該位與對應的1相與即可保留,而不想要的可以和0相與進而做到歸0.

是以一個數的二進制數想要隻保留偶數位隻需和1010,1010…1010即可.

代碼中為何和0xaaaaaaaa相與?

答:請看這篇文章 [​​和十六進制數進行位運算​​]

異或的效果 : 相同為0,不同為1

代碼示範

import java.util.Scanner;

/**
 * 需求: 将整數的奇偶位互換
 * 
 * @author Clearlight
 *
 */
public class OddEvenExchange {

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int bin = sc.nextInt();

    int exchangeBin = exchangeOddEven(bin);

    System.out.println(bin + " : " + Integer.toBinaryString(bin));
    System.out.println(exchangeBin + " : " + Integer.toBinaryString(exchangeBin));
  }

  public static int exchangeOddEven(int bin) {

    int even = bin & 0xaaaaaaaa;
    int odd = bin & 0x55555555;

    return (even >> 1) ^ (odd << 1);
  }
}      

輸出結果:

整數的奇偶位互換-Java____[位運算思維]