首页 > 试题广场 >

奇偶位交换

[编程题]奇偶位交换
  • 热度指数:8075 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个int x,交换其二进制的奇数位和偶数位,并返回交换后的数int。

测试样例:
10
返回:5
/**
         * 0xaaaaaaaa=10101010101010101010101010101010(偶数位为1,奇数位为0)
         * 0x55555555=1010101010101010101010101010101(偶数位为0,奇数位为1)
         */
        int odd = x & 0x55555555;// 将偶数位全部清零,奇数位1保留
        int even = x & 0xaaaaaaaa;// 将奇数位全部清零,偶数位1保留
        return (odd<<1) + (even>>1);
        // 将odd全部往左移一位,即将偶数位0全部变为奇数位0,原奇数位的1变为偶数位的1
        // 将even全部往右移位一位,即将奇数位0全部变为偶数位0,原偶数位1变为奇数位1
        // 两者相加,得到交换二进制的奇数位和偶数位的值

发表于 2021-08-04 14:56:57 回复(0)
//奇数位左移一位+偶数位右移一位 
public int exchangeOddEven(int x) {
       return (x&0x55555555)<<1|((x&0xaaaaaaaa)>>>1);
    }

发表于 2017-05-14 01:18:40 回复(1)

思路

首先要保证二进制的位数为偶数才能对换,所以若二进制位数为奇数,则需在开头添加0.

public int exchangeOddEven(int x) {
    // 将十进制int转换成二进制字符串
    String binStr = Integer.toBinaryString(x);
    // 若二进制位数为奇数,则在最前端补0
    if ( binStr.length()%2 == 1 )
        binStr = "0"+binStr;

    char[] charArray = binStr.toCharArray();
    for ( int i=1; i<charArray.length; i+=2 ) {
        char temp = charArray[i-1];
        charArray[i-1] = charArray[i];
        charArray[i] = temp;
    }

    // 将二进制字符串转换成十进制整数
    return Integer.valueOf( new String(charArray), 2 );
}
  • 二进制字符串转换成十进制整数:Integer.valueOf( str, 2 )
  • 十进制int转成二进制字符串:Integer.toBinaryString(int x)
发表于 2017-03-31 17:41:05 回复(0)