好玩的位运算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: 将整数的奇偶位互换的主要内容,如果未能解决你的问题,请参考以下文章

好玩的位运算5:数字中1的个数

位运算

好玩的位运算4:如果用二进制表示小数

奇数位的位奇偶校验码

在没有按位运算的情况下翻转整数中的位

好玩的位运算1:找数组中找成对和不成对