java - 反转 int 中的所有位并返回 int

标签 java 64-bit bit-manipulation bitwise-operators

当我们反转整数 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 位字段,然后是 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 合并为一个表达式。这适用于大多数机器。

关于java - 反转 int 中的所有位并返回 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619397/

相关文章:

c++ - WndProc 中的 64 位异常静默失败

java - Guava 中是否有一个不关心其值顺序的 SortedMultimap 类型实现

java - Java中线程的同步

python - 使用 Fortran 求解器在 Windows 64 位上安装 Odespy

r - 无法安装包车

c - C中的按位运算符下面的概念是什么?它优化了我的代码并大大减少了运行时间

php - 按位和 MySQL 进行分页

c - 如何将具有右位移位的数字除以非 2 的幂

java - 如何传递用户名和密码来调用restful web服务

java - 验证元素是否存在