将整数的二进制奇偶位互换
2019-12-14 本文已影响0人
FiveZM
/*
将一个整数的奇偶位互换
例如输入整数9,二进制表示形式为1001
互换后的结果为0110
神奇的算法:
知识点一: 位运算中,1与一个数字进行与运算等于该数字,其实这是一种保留数字的运算
例如 1 和0进行与运算,结果是0自己
1和 1进行与运算,结果也是1自己,那么1和任何数进行与运算其实是一种保留的运算
知识点二:位运算中,0与一个数字进行与运算,等于0,其实这是一种舍弃数字的运算
例如 0 和 0进行与运算,结果是0
0和1进行与运算,结果还是0,已经舍弃了1,
算法核心:将目标整数,假设是9,即1001
第一步:先将...00001001与运算它01010101010101...一共32位,因为int占4个字节,一个字节8位,
这里的010101位偶数位是1
结果是 1001
&0101
-----
0001 -----记录为 ou
第二步:再将1001与101010......1010进行与运算,这里的1010位奇数为是1
结果是 1001
&1010
-----
1000 -----记录为 ji
第三步:将ou 左移一位,将ji右移一位
再进行异或运算,结果为交换奇偶位
0001 ---ou左移得到0010
1000 ---ji右移得到0100
进行异或运算 0010
^0100
-----
0110 ------结果
知识点三:
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 将整数的二进制奇偶位互换 {
//测试输入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));
}
}