java运算符  移位运算符

学了忘,忘了学,学了还得忘

 最近在看HashMap源码时发现了诸多运算符,为了避免学了就忘,总结一下

一:位与运算符 &

运算规则:比较的数转为二进制 从高位开始比较 如果都为1则为1 反之为0

二:位非运算符

运算规则:如果位为0 结果为1 位为1 结果为0

在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.

2的二进制码为:10

补码为:000000000000000000000000 00000010

内存中的保存形式为取反:11111111111111111111111111111101

正数的补码和原码一样,负数的原码转补码或者补码转原码的规则:

符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码。(这里我们只取后八位 不影响最终结果)

1111 1101 ->>> 1000 0010

1000 0010 ->>> 1000 0011

得到的结果为-3

3的二进制码为: 0000 0011 在内存中的形式为 1111 1100

符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码。

1111 1100 ->>> 1000 0011

1000 0011 ->>> 1000 0100

得到的结果为-4

-2的二进制码为 11111111111111111111111111111110

内存中存储形式为 0000 0001

所以~ -2就是 1

结果验证

三:位或运算符 |

运算规则:比较的数转为二进制 从高位开始比较 有1则为1 反之则为0

四:异或运算符 ^

运算规则:从高位开始比较 相同则为0 不同则为1

五:左移运算符 <<

不分正负数,低位补0

2的二进制 10 (正整数)

2<<1 二进制码 100   2*(2)
2<<2 二进制码 1000 2*(2*2)

总结 num << count   num*(2的count次方)

源码验证 正整数

 

负整数

六:>> 右移运算符   

>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

16的二进制码 10000 (正整数)

16>>1 二进制码 01000 16/(2)

16>> 2 二进制码 00100 16/(2*2)

16>> 3 二进制码 00010 16/(2*2*2)

总结  num >> count   num/(2的count次方) 

源码验证 正整数

负整数

七:>>> 右移运算符

>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

源码验证 正整数

负整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值