华为2021秋招笔试——0826第三题二进制移位

tech2022-09-20  68

题目描述: 对输入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; } }
最新回复(0)