use*_*973 2 java 64-bit bit-manipulation bitwise-operators
当我们反转整数1的所有位时应该返回什么整数?我们如何使用Java代码执行此操作?
不应使用内置函数的java.不应该使用String reverse,转换为字符串等.只允许按位操作.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
位反转可以通过交换相邻的单个位,然后交换相邻的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
Run Code Online (Sandbox Code Playgroud)
通过查看每个中间结果,您可以看到发生了什么.

希望这能为您提供所需的信息,让您在脑海中解决问题.John Doe的回答将第4步和第5步合并为一个表达式.这适用于大多数机器.