有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java反转整数中的所有位并返回整数

当我们反转整数1的所有位时,应该返回哪个整数?我们如何用Java代码做到这一点

不应使用java内置函数。不应使用字符串反转、转换为字符串等。只允许按位操作

import java.util.*;
import java.lang.*;
import java.io.*;

class BitReverseInt
{
    public static void main (String[] args) throws java.lang.Exception{
        System.out.println(reverser(1));
    }

    public static int reverser(int given){
          int input = given;
          int temp = 0;
          int output = 0;
          while(input > 0){
            output = output << 1;
            temp = input & 1;
            input = input >> 1;
            output = output | temp;
          }

          return output;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    位反转可以通过交换相邻的单个位,然后交换相邻的2位字段,然后交换4位字段,依此类推,如下所示。这五条赋值语句可以按任意顺序执行

    /********************************************************
     * These are the bit masks used in the bit reversal process
    
       0x55555555 = 01010101010101010101010101010101
       0xAAAAAAAA = 10101010101010101010101010101010
       0x33333333 = 00110011001100110011001100110011
       0xCCCCCCCC = 11001100110011001100110011001100
       0x0F0F0F0F = 00001111000011110000111100001111
       0xF0F0F0F0 = 11110000111100001111000011110000
       0x00FF00FF = 00000000111111110000000011111111
       0xFF00FF00 = 11111111000000001111111100000000
       0x0000FFFF = 00000000000000001111111111111111
       0xFFFF0000 = 11111111111111110000000000000000
    
     */
    
        uint x = 23885963;    // 00000001011011000111100010001011
    
        x = (x & 0x55555555) <<  1 | (x & 0xAAAAAAAA) >>  1; 
        x = (x & 0x33333333) <<  2 | (x & 0xCCCCCCCC) >>  2; 
        x = (x & 0x0F0F0F0F) <<  4 | (x & 0xF0F0F0F0) >>  4; 
        x = (x & 0x00FF00FF) <<  8 | (x & 0xFF00FF00) >>  8; 
        x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;
    
        // result x == 3508418176   11010001000111100011011010000000
    

    通过查看每个中间结果,你可以看到正在发生什么

    enter image description here

    希望这能给你所需要的,在你的头脑中解决它。John Doe的答案将第4步和第5步合并为一个表达式。这在大多数机器上都适用

  2. # 2 楼答案

    在Java中,有多种方法可以反转给定数字的位

    首先,Java语言有内置的位补码运算符(~)。所以(~number)反转数字的位

    其次,可以使用整数。反向(数字)

    第三,如果这是测试的一部分,或者你只是想玩比特,你可以参考下面的代码

    /*
    The logic uses moving bitmask from right to left:
    
     1. Get the bit of given number, by binary and(&) with bitmask
     2. XOR(^) with the bitmask, so here we reverse the bit.
     3. OR(|) this reversed bit with the result(result has all Zero initially)
    
    This logic is repeated for each 32 bits by moving the mask from right to left, 
    one bit at a time using (<<) left shift operator on bitmask.
    */
    public class ReverseBits {
    
        public static int reverseBits(int input) {
            print("Input", input);
            int bitmask = 1;
            int result = 0;
            do {
                //print("Bitmask", bitmask);
                result = result | (bitmask ^ (input & bitmask)) ;
                //print("Result", result);
                bitmask = bitmask << 1;
            } while (bitmask != 0);
            print("Reverse", result);
            return result;
        }
    
        public static void print(String label, int input) {
            System.out.println(label +"\t:"+Integer.toBinaryString(input));
        }
    
        public static void main(String[] args) {
            reverseBits(Integer.MIN_VALUE);
            reverseBits(Integer.MAX_VALUE);
            reverseBits(reverseBits(170));
        }
    }
    

    输出:

    Input   :10000000000000000000000000000000
    Reverse :1111111111111111111111111111111
    Input   :1111111111111111111111111111111
    Reverse :10000000000000000000000000000000
    Input   :10101010
    Reverse :11111111111111111111111101010101
    Input   :11111111111111111111111101010101
    Reverse :10101010