带符号右移与无符号右移顶折带符号右移 >>对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1无符号右移>>>如果是一个负数,那么对应的二进制的第一位是1无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0这样就会使得负数在无符号右移后,得到一个正数简单的说:带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变无符号右移>>>移动后,变正的了123456789101112131415161718192021222324252627public class HelloWorld { public static void main(String[] args) { int i =-10; //-10的二进制是11111111111111111111111111110110 //第一位是1,即符号位,代表这是一个负数 System.out.println(Integer.toBinaryString(i)); //对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0 //对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1 //-10带符号右移1位,移动后前面补齐1 //得到11111111111111111111111111111011 //因为第一位是1,所以依然是一个负数,对应的十进制是-5 int j = i>>1; System.out.println(Integer.toBinaryString(j)); System.out.println(j); //-10无符号向右移1位,符号位也会向右移,第一位就变成了0 //得到01111111111111111111111111111011,对应的十进制是2147483643 int k = i>>>1; System.out.println(Integer.toBinaryString(k)); System.out.println(k); } }操作符int i = 3; // 二进制是11int j = 2; // 二进制是10int c = ((i | j) ^ (i & j)) << 2 >>> 1; 1.((11)^(10))<<2>>>1;2.(01)<<2>>>1;3.(100)>>>1;4.10 (十进制表达就是2)

举报 0