题目描述:
对输入n个无符号整数,进行二进制的移位和调换进行加扰,加扰后仍然保持n个整数。
输出加扰后的n个整数,两个整数之间空格分开。
加扰步骤:
1.先把每个整数每两个bit交换位置,如bit0和bit1交换,bit2和bit3交换,依此类推;
2.再把每个整数向右移2位,溢出的部分,第一个整数的最低2bit移到第二个整数的最高两bit上,第二个整数的最低2bit移到第三个整数的最高两bit上,依此类推,最后—个整数的最低2bit移到第个整数的最高2bit上。如果输入只有一个整数,溢出的2bit移到自己的最高2bit上。
说明,无符号整数的范围不超过32bit整数大小。
输入描述
1 2
输出描述
1073741824 2147483647
import java.util.Scanner;
public class First {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String sb = new String();
String[] str = sc.nextLine().split(" ");
for (int i = 0; i < str.length; i++) {
sb += get32BitBinString(bit_reverse(Integer.parseInt(str[i])));
}
sb = sb.substring(sb.length() - 2, sb.length()) + sb;
sb = sb.substring(0, sb.length() - 2);
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i < sb.length() / 32; i++) {
sb1.append(sb.substring(32 * i, 32 * (i + 1) - 1) + sb.charAt(32 * (i + 1) - 1));
System.out.print(bTd(sb1.toString()) + " ");
sb1.delete(0, sb1.length());
}
}
private static String get32BitBinString(int number) {
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < 32; i++) {
sBuilder.append(number & 1);
number = number >>> 1;
}
return sBuilder.reverse().toString();
}
private static int bit_reverse(int n) {
{
n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
return n;
}
}
//二进制转十进制
public static long bTd(String str) {
long decimal = 0;
int p = 0;
int i = 31;
for (; p < 32; p++, i--) {
decimal += (str.charAt(i) - '0') * Math.pow(2, p);
}
return decimal;
}
}