/*
將一個整數(shù)的奇偶位互換
例如輸入整數(shù)9,二進制表示形式為1001
互換后的結(jié)果為0110
神奇的算法:
知識點一: 位運算中,1與一個數(shù)字進行與運算等于該數(shù)字,其實這是一種保留數(shù)字的運算
例如 1 和0進行與運算,結(jié)果是0自己
1和 1進行與運算,結(jié)果也是1自己,那么1和任何數(shù)進行與運算其實是一種保留的運算
知識點二:位運算中,0與一個數(shù)字進行與運算,等于0,其實這是一種舍棄數(shù)字的運算
例如 0 和 0進行與運算,結(jié)果是0
0和1進行與運算,結(jié)果還是0,已經(jīng)舍棄了1,
算法核心:將目標整數(shù),假設(shè)是9,即1001
第一步:先將...00001001與運算它01010101010101...一共32位,因為int占4個字節(jié),一個字節(jié)8位,
這里的010101位偶數(shù)位是1
結(jié)果是 1001
&0101
-----
0001 -----記錄為 ou
第二步:再將1001與101010......1010進行與運算,這里的1010位奇數(shù)為是1
結(jié)果是 1001
&1010
-----
1000 -----記錄為 ji
第三步:將ou 左移一位,將ji右移一位
再進行異或運算,結(jié)果為交換奇偶位
0001 ---ou左移得到0010
1000 ---ji右移得到0100
進行異或運算 0010
^0100
-----
0110 ------結(jié)果
知識點三:
01010101....0101 可用 0x55555555 表示
因為 是 32位 ,即0101 0101 0101 0101 0101 0101 0101 0101
每一個4位可以用一個16進制表示,而0101 是5
所以有8個5 , 即0x55555555
010101010....0101 可用 0x55555555 表示
同理1010 等于10 ,10用16進制表示是a
10101010....1010 可用0xaaaaaaaa表示
*/
import java.util.Scanner;
public class 將整數(shù)的二進制奇偶位互換 {
//測試輸入9,二進制位1001, 輸出6 二進制位110,110前面的0被省略了
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = Integer.toBinaryString(n);
System.out.println(s);
int ji = n&0xaaaaaaaa; //101010....
int ou = n&0x55555555; //010101...
int result = (ou<<1)^(ji>>1);
System.out.println(result);
System.out.println(Integer.toBinaryString(result));
}
}