将整数的奇偶位互换
我感觉这个题给的那种思路的写法是有漏洞的,即第一种给的那种思路,漏斗就在于最高位为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

浙公网安备 33010602011771号