将整数的奇偶位互换

我感觉这个题给的那种思路的写法是有漏洞的,即第一种给的那种思路,漏斗就在于最高位为1时的情况
而我自己的哪种方法也有漏洞就是给一个整数后s[i+1]这里的i+1会越界,越界的原因在于s1.length()会是这个整数最高位为1向后的位数而不是32位
没有一个满意的写法
代码如下:

package 将整数的奇偶位互换;

/**
 * @author 邓雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-10-23-17-24
 */
public class Demo {
    public static void main(String[] args) {
        int a = 0x80000000;//0110
        String s1 = Integer.toBinaryString(a);
        System.out.println("交换前整数的二进制形式:\n"+s1);
        System.out.println("交换前整数为:"+a);
        int b = m(a);
        String s2 = Integer.toBinaryString(b);
        System.out.println("交换后整数的二进制形式:\n"+s2);
        System.out.println("交换后整数为:"+b);
        //上面是第一种下面是第二种
        String s[] = new String[s1.length()];
        for (int i = 0; i < s.length; i++) {
            s[i] = String.valueOf(s1.charAt(i));
            System.out.print(s[i]);
        }
        for (int i = 0; i < s.length; i+=2) {
            String s3 = s[i];
            s[i] = s[i+1];
            s[i+1] = s3;
        }
        System.out.println();
        for (int i = 0; i < s.length; i++) {
            System.out.print(s[i]);
        }

    }
    private static int m(int i){
        int ou = i&0xaaaaaaaa;//和1010 1010 ... 1010 做与运算取出偶数位
        int ji = i&0x55555555;//和0101 0101 ... 0101 做与运算取出奇数位
        return (ou>>1)^(ji<<1);//然后让偶数位的右移1位->异或->奇数位左移一位 连起来
    }
}

运行结果如下

交换前整数的二进制形式:
10000000000000000000000000000000
交换前整数为:-2147483648
交换后整数的二进制形式:
11000000000000000000000000000000
交换后整数为:-1073741824
10000000000000000000000000000000
01000000000000000000000000000000
posted @ 2021-10-23 18:22  ╰(‵□′)╯  阅读(55)  评论(0)    收藏  举报