学了忘,忘了学,学了还得忘
最近在看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
源码验证 正整数
负整数