我有两种方法来反转字节,我认为它们都有效,但令我惊讶的是其中一个有意想不到的输出。代码如下:
public class ReverseByte {
public static void main(String[] args) {
byte a = (byte) 128;
String s1 = String.format("%8s", Integer.toBinaryString(a & 0xFF)).replace(' ', '0');
System.out.println(s1);
int res = reverseByte1(a);
System.out.println(res);
System.out.println(Integer.toBinaryString(res));
}
public static int reverseByte1(byte b) {
int bi = b, res = 0, count = 8;
for ( ; bi != 0; count--, bi >>>= 1)
res = (res << 1) | (bi & 1);
res <<= count;
return res;
}
public static int reverseByte2(byte b) {
int res = 0;
for (int bi = b, i = 0; i < 8; i++, bi >>>= 1)
res = (res << 1) | (bi & 1);
return res;
}
}
reverseByte1的结果(错误)是:
10000000
-256
11111111111111111111111100000000
reverseByte2(右边)的结果是:
10000000
1
1
我无法弄明白为什么,有人可以告诉我为什么吗?反转整数时,第一种方法效果很好。
答案 0 :(得分:2)
将声明更改为
int bi = b & 0xFF;
否则,您的bi
将等于11111111111111111111111110000000
,并且循环将重复32次,直至bi == 0
。
答案 1 :(得分:0)
dejvuth是对的,你也可以使用count变量来停止
for ( ; count != 0; count--, bi >>>= 1)
res = (res << 1) | (bi & 1);