Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中求逆整数_Java_Binary - Fatal编程技术网

Java中求逆整数

Java中求逆整数,java,binary,Java,Binary,Java中有一种方法可以反转整数reverseBytes()中的位。我想尝试另一种实现,这就是我所拥有的: 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 &g

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

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;
}
公共静态int反转(int num){
int num_rev=0;
对于(int i=0;i>i)和1);
如果((num>>i)&1)!=0){
num_rev=num_rev |(int)Math.pow(2,Integer.SIZE-i);
}
}
返回num_rev;
}
结果num_rev不正确。有人知道如何“重建”价值吗?也许有更好的方法来执行它


谢谢你的建议

您不想使用的原因:

public static int reverseBytes(int i) {
    return ((i >>> 24)           ) |
           ((i >>   8) &   0xFF00) |
           ((i <<   8) & 0xFF0000) |
           ((i << 24));
}
返回通过以下方式获得的值: 反转数据中位的顺序 二元补码表示法 指定的int值


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

e、 g(注意:未经测试)

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


它的工作原理是:首先交换每一位,然后交换每一对位,然后交换每一个Nyble,然后交换每一个字节,最后交换顶部和底部的16位字。这实际上是可行的:)

您的代码有两个问题:

  • 您正在使用int类型转换。你应该做(长)数学。pow(…整数施法的问题是,pow(2,n)总是一个正数,所以施法到整数的pow(2,31)将四舍五入到(2^31)-1,因为这是最大的正整数。2^31-1的位字段是0x7ffffff,但在本例中,您需要0x8000000,这正是浇铸long的较低32位
  • 您正在执行pow(2,Integer.Size-i)。这应该是Integer.Size-i-1。您基本上希望将位0设置为最后一位,将位1设置为倒数第二位,依此类推。但是,最后一位是位31,而不是位32。您的代码现在正在尝试将位0设置为位整数。Size-0==32,因此需要减去1

  • 以上假设这只是为了好玩。但是,如果您真的需要反转位,请不要使用浮点运算。按照其他一些答案的建议进行操作。

    您能给出一个错误结果的示例吗?您是否尝试过调试这个问题?您是在尝试反转所有32位的顺序,还是只是从一个endian形式交换到other(即交换字节)我正在尝试反转所有32位的顺序。例如:110应该反转为0110000000…(添加所有0)。您是否尝试过反转(int)方法?你能举例说明你期望的结果和它返回的结果吗?我想自己实现它,而不是使用java提供的方法。如果我们从int 110开始,那么我希望得到011000…等等。谢谢你的帮助!非常感谢。出于某种原因,我一直得到相同的结果;我需要测试你的解决方案:)
    public static int reverse(int i)
    
    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;
    }
    
    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));
    }