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

题目描述:
对输入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;
    }
}    

猜你喜欢

转载自blog.csdn.net/weixin_43419256/article/details/108375401