在Java中反转字节

时间:2015-07-30 13:55:07

标签: java

我有两种方法来反转字节,我认为它们都有效,但令我惊讶的是其中一个有意想不到的输出。代码如下:

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

我无法弄明白为什么,有人可以告诉我为什么吗?反转整数时,第一种方法效果很好。

2 个答案:

答案 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);