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/