public class Test1 {
    public static void main(String[] args) {
        byte x = 112;
        x = (byte) (x << 3 | x >> 5);
        System.out.println(x);
        byte x1 = (byte) (x>>3);
        System.out.println("x1:"+ x1);
        byte x2 = (byte) (x<<5);
        System.out.println("x2:"+ x2);
        x = (byte)(x2 | x1);
        System.out.println(x);
}
}
结果:
-125
x1:-16
x2:96
-16-------
x1的值应该是16啊.为什么会显示是-16?...什么原因咋解决?

解决方案 »

  1.   


    public class Main {    public static void main(String[] args) {
            byte x = 112;//x = 0111 0000
            Byte bb = new Byte((byte)112);
            x = (byte) (x << 3 | x >> 5); //x = (1000 0000 | 0000 0011)=(1000 0011)
            System.out.println(x);
            byte x1 = (byte) (x>>3);  //x1 = 1111 0000  //1000 0000为-0(x<0右移时被1),0000 0000为+0
            System.out.println("x1:"+ x1);
            byte x2 = (byte) (x<<5);  //x2 = 0110 0000
            System.out.println("x2:"+ x2);
            x = (byte)(x2 | x1);//x =1111 0000
            System.out.println(x);        //////////
            byte t = -127;//1000 0001
            System.out.println(""+Integer.toBinaryString(t));
            System.out.println(""+Integer.toBinaryString(t>>3));
        }
    }
    /**-125
    x1:-16
    x2:96
    -16
    11111111111111111111111110000001
    11111111111111111111111111110000*/
      

  2.   

    負數的問題在於JAVA打印的時候都是當成有符號打印出來,你要把他轉換成十六進制,然後打印出來
      

  3.   

    To bawgiitx,
    感谢解释.有没有好的解决方案推荐下.
      

  4.   

    byte x1 = (byte) (x>>3);
    =>
    byte x1 = (byte) (x>>>3);
    这样试试看呢?算数右移与逻辑右移的区别
      

  5.   

    To楼上
    >>>是无符号移位。byte是有符号的。
      

  6.   

    byte x = -125;
    System.out.println((byte)(x >>> 3));
    输出是-16.而正确结果是16.
      

  7.   

    额,我错了,移位运算应该是先把x转为int,然后再运算的,所以无论是算数还是逻辑,截取后8位都变成了-16
      

  8.   

    public static void main(String[] args) {
    byte x = 112;
    x = (byte) (x << 3 | x >> 5);
    System.out.println(x);
    System.out.println(x>>3);
    System.out.println(x>>>3);
    }结果是这样的
    -125
    -16
    536870896
      

  9.   

    你可以试试看用这个函数 public static byte SHR(byte b, int shift) {
    return (byte) ((b & 0xff) >> shift);
    }
    自己写的,用来代替>>>
      

  10.   

    LS没错,是在byte移位之前先转换为了int导致的,如果想要无符号移位就得(0xff&x)才可以