欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

整数的奇偶位互换-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);
	}
}

输出结果:
整数的奇偶位互换-Java____[位运算思维]
整数的奇偶位互换-Java____[位运算思维]