好玩的位运算3: 将整数的奇偶位互换
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好玩的位运算3: 将整数的奇偶位互换相关的知识,希望对你有一定的参考价值。
题目要求如上所述,将一个整数的奇偶位互换,例如一个8位整数是(10101100)b那么奇偶互换之后就是(01011100)b。假设机器是32位的,请你解决这个问题。
首先一个问题,对于32位,从左开始还是从右开始,奇偶位置是不一样的,但是一共就32位,反正都是交换,我们干脆自己规定一下。最低位开始数,最低位是第0位,是偶数为,次低位时第1位,是偶数位。
这个问题虽然是整数,但是用二进制表示的,所以我们的第一反应是转换成数组再来循环处理,这样虽然能解决问题,但是有点low,你还是要写很多代码才行。如果使用位运算三行就搞定了。我们知道在二进制中,一个数字与1进行&运算就是保留原来的结果,如果与0进行与运算就是将其归0,这里我们如果分别对奇数位和偶数位进行归零运算,如下图:
这样我们可以分别得到奇数位和偶数位了,然后将其一个左移,一个右移之后再将两个数做异或操作就达到交换的目的了。
进一步发现5的二进制是0101,而a的二进制是1010,所以两个归零操作可以使用0x5555555和0xaaaaaaaa来代替,这样处理就变得非常简单了:
public class ExchangeJiOu
public static void main(String[] args)
int a = 0b01000000000000000000000000000000;
System.out.println(a);
int b = exchange(a);
int c = 0b10000000000000000000000000000000;
System.out.println(b == c);
private static int exchange(int num)
int ou = num & 0xaaaaaaaa;
int ji = num & 0x55555555;
return (ou >> 1) ^ (ji << 1);
在代码中,我们通过输出的结果是否等于c来判断,这是因为exchange之后输出的结果为10进制不方便比较。
以上是关于好玩的位运算3: 将整数的奇偶位互换的主要内容,如果未能解决你的问题,请参考以下文章