好玩的位运算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进制不方便比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵横千里,捭阖四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值