当前位置: 代码迷 >> java >> Java中的反向字节
  详细解决方案

Java中的反向字节

热度:96   发布时间:2023-07-17 20:51:05.0

我有两种方法来反转字节,我以为它们都可以工作,但是令我惊讶的是,其中一种方法具有意外的输出。 代码如下:

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

我不知道为什么,有人可以告诉我为什么吗? 第一个方法在反转整数时效果很好。

将声明更改为

int bi = b & 0xFF;

否则,您的bi将等于11111111111111111111111110000000 ,并且循环将重复32次,直到bi == 0为止。

dejvuth是正确的,也可以使用count变量停止

for ( ; count != 0; count--, bi >>>= 1)
    res = (res << 1) | (bi & 1);