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?...什么原因咋解决?
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?...什么原因咋解决?
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*/
感谢解释.有没有好的解决方案推荐下.
=>
byte x1 = (byte) (x>>>3);
这样试试看呢?算数右移与逻辑右移的区别
>>>是无符号移位。byte是有符号的。
System.out.println((byte)(x >>> 3));
输出是-16.而正确结果是16.
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
return (byte) ((b & 0xff) >> shift);
}
自己写的,用来代替>>>