整数的奇偶位互换-Java____[位运算思维]
程序员文章站
2022-04-21 17:53:00
...
需求
将整数的奇偶位互换
例: 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);
}
}
输出结果: