程序员面试金典——5.6奇偶位交换

程序员面试金典——5.6奇偶位交换

转载自:https://www.nowcoder.com/profile/2218461/codeBookDetail?submissionId=18713259
思路:
用0xAAAAAAAA与x相与求的奇数位上数字(偶数位上数字为0)
用0x 55555555 与x相与求的偶数位上数字(奇数位上数字为0)
oddVal右移一位 even左移一位 相加即可。
楼上很多没有&0xfffffffe与 &0x7fffffff这两步,可能能通过,却是不严谨的,因为int是有符号整型,所以如果x的最高位为1,那么取偶数位得到的数even的最高位也为1,如果此时右移,那么最高位补1而不是0,后面或的时候就有可能出问题,因为1|0等于1,改变了不该变的值。
举个例子:
x为1000…..0(总共31个0)
取偶数位得 even = 1000….0
取奇数位得 odd = 0000…..0
因为int为整型,最高位为1的为负数,右移将在左边添1
即even右移后为1100….0
even | odd = 1100….0
很明显不正确,结果应该为0100…….0才对
所以要把even的最高位置为0,即让even与 0x7fffffff相与。

class Exchange {
public:
    int exchangeOddEven(int x) {
        // write code here
        int odd  = ((x&0x55555555)<<1);
        int even = ((x&0xAAAAAAAA)>>1)&0x7fffffff; 
        return even|odd;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值