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  下图分别输出:


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容