问题描述
我有两种方法来反转字节,我以为它们都可以工作,但是令我惊讶的是,其中一种方法具有意外的输出。 代码如下:
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
我不知道为什么,有人可以告诉我为什么吗? 第一个方法在反转整数时效果很好。
1楼
将声明更改为
int bi = b & 0xFF;
否则,您的bi
将等于11111111111111111111111110000000
,并且循环将重复32次,直到bi == 0
为止。
2楼
dejvuth是正确的,也可以使用count变量停止
for ( ; count != 0; count--, bi >>>= 1)
res = (res << 1) | (bi & 1);