java - Java中获取反转整数

标签 java binary

Java 中有一种方法可以反转 IntegerverseBytes() 中的位。我想尝试另一种实现,这就是我所拥有的:

public static int reverse(int num) {

        int num_rev = 0;
        for (int i = 0; i < Integer.SIZE; i++) {
            System.out.print((num >> i) & 1);

            if (((num >> i) & 1)!=0) {

                num_rev = num_rev | (int)Math.pow(2, Integer.SIZE-i);
            }

        }
        return num_rev;
}

结果 num_rev 不正确。有谁知道如何“重建”值(value)?也许有更好的方法来执行它?

感谢您的任何建议。

最佳答案

反转位的正常方法是通过位操作,当然不是通过 float 学例程!

例如(注意:未经测试)。

int reverse(int x) {
    int y = 0;
    for (int i = 0; i < 32; ++i) {
        y <<= 1;       // make space
        y |= (x & 1);  // copy LSB of X into Y
        x >>>= 1;      // shift X right
    }
    return y;
}

因为x右移,y左移,结果是x的原始LSB最终成为的MSB y.

一个很好的(并且相当众所周知的)方法是这样的:

unsigned int reverse(unsigned int x)
{
    x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
    x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
    x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
    x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
    return ((x >> 16) | (x << 16));
}

这实际上是 C 代码,但由于 Java 没有 unsigned 类型可以移植到 Java,因此您需要做的就是删除 unsigned 限定符并使用 >>> 而不是 >> 以确保您不会获得任何“符号扩展”。

它的工作原理是首先交换每隔,然后每隔位,然后每隔nybble,然后每隔>byte,最后是顶部和底部 16 位字。这确实有效:)

关于java - Java中获取反转整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5451460/

相关文章:

c# - 使用 C# Windows Phone 下载加密的二进制文件丢失数据

c++ - 后续用C++对Files进行读写操作

c - 二进制和十进制转换

c - C语言十进制转二进制

java - 查找在参数方法中传递的对象的类型

java - @Profile ("String") 和 @ProfileName 有什么区别

java - Puppet 安装java 然后找到JAVA_HOME

java - 如何显示标签 JFreeChart 的百分比值?

javascript - 使用 JavaScript 从二进制文件中读取字节,无需 jQuery

java - spring-r2dbc 中忽略更新字段