java 三种运算符理解
>> : 右移运算符;低位移出,符号位不变
<< : 左移运算符;高位移出,符号位不变
>>> : 无符号右移;
先理解下原码、补码、反码;
举个栗子:
10
原码:0000 0000 0000 0000 0000 0000 0000 1010
补码:0000 0000 0000 0000 0000 0000 0000 1010
反码:0000 0000 0000 0000 0000 0000 0000 1010
正数的原码、补码、反码都一样
-10
原码:1000 0000 0000 0000 0000 0000 0000 1010
反码:1111 1111 1111 1111 1111 1111 1111 0101
补码:1111 1111 1111 1111 1111 1111 1111 0110
负数的原码:高位数为符号位1;反码则符号位不变,其他位取反,0 -> 1,1 ->0;
补码则是反码+1;
计算机都是补码来存储的;
10 << 1 左移一位
0000 0000 0000 0000 0000 0000 0000 1010 把左边踢去一位,右边用0补齐;
0000 0000 0000 0000 0000 0000 0001 0100 十进制为20;
-10 << 1 左移一位
1111 1111 1111 1111 1111 1111 1111 0110 符号位不变,把左边踢去一位,右边用0补齐;
1111 1111 1111 1111 1111 1111 1110 1100 十进制为-20;
10 >> 1 右移一位
0000 0000 0000 0000 0000 0000 0000 1010 把右边踢去一位,左边用0补齐;
0000 0000 0000 0000 0000 0000 0000 0101 十进制为5;
-10 << 1 左移一位
1111 1111 1111 1111 1111 1111 1111 0110 符号位不变,把右边踢去一位,左边用0补齐;
1111 1111 1111 1111 1111 1111 1111 1011 十进制为-5;
而>>>比较特别无符号位,不管是正数负数,高位都用0补齐(符号位也变),正数>>>跟>>一样;负数则有区别;
-10 >>> 1
1111 1111 1111 1111 1111 1111 1111 0110 把右边踢去一位,左边用0补齐;
0111 1111 1111 1111 1111 1111 1111 1011 下图分别输出: