需求
将整數的奇偶位互換
例: 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);
}
}
輸出結果: