1.java左移运算符“<
-5的二进制原码为:100000000 00000000 00000000 00000101 很容易得出补码为:111111111 11111111 11111111 11111011 -5<<2的结果为:111111111 11111111 11111111 11101100 -5<<2的原码为:100000000 00000000 00000000 00010100 -5<<2转化十进制为:-20 -5<<29的结果为:011000000 00000000 00000000 00000000 -5<<29十进制结果为:1,610,612,736
由以上可以的出结论,负数左移可以变成正数,正数左移可以变成负数,在数字没有溢出的前提下,n<
2.java带符号右移运算符">>": n>>m就是在高位补m个符号位,低位舍弃 5的二进制为:00000000 00000000 00000000 00000101 5>>1的结果为:00000000 00000000 00000000 00000010 5>>1十进制为:2
-5的二进制原码为:100000000 00000000 00000000 00000101 很容易得出补码为:111111111 11111111 11111111 11111011 -5>>1的结果为:111111111 11111111 11111111 11111101 -5>>1的原码为:100000000 00000000 00000000 00000011 -5>>1十进制为:-3
n>>m的数学意义为n/2^m向下取整
3.java无符号右移运算符">>>": n>>>m就是在高位补m个0,低位舍弃,对于正数来说它等同于n>>m,对于负数来说可以通过无符号右移变成正数
总结:对于int类型来说,单移动位数超过31位,则实际移动位数为:m%32,列如5<<35 = 5<<3