今天在看HashMap 源码的时候 看到了位移运算符,正好再复习一下
左移运算符
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
在 Main 方法中 计算1 << 4 得出的结果是 16
继续计算 2 << 4 得出的结果是32.
首先看 1 << 4 这个操作,读法是 1 向左移动 4 位,用 二进制表示就是
0000 0001 十进制表示是 1
0001 0000 十进制表示是16
左移运算符就是在给定数值的基础上向左移动 N 位,注意如果是高位进行改变了,那么我们要注意负数的变化。
如果int 类型左移位数 大于等于 32 位的时候,要先求余(%)后再进行左移操作,也就是说 假如我们左移 32 位,该int 类型的 二进制 全部变成了0 ,当然最后的结果肯定不为0 了,比如
System.out.println(1 << 36);
最后的得出结果还是16,而且在 IDEA 中还提示
// Shift operation '<<' by overly large constant value
也就是说左移 32 位不进行操作,左移40位相当于左移8位(40%32=8)。如果是 long 类型,则相应的操作位数会变大,变成64 位,所以 long 类型 左移 64 位无变化,左移 66 位相当于 (66%64 = 2)位
右移 运算符
右移运算符分为 2 种, >> (右移运算符) 和 >>> (无符号右移运算符)
>> (右移运算符)
右移运算符就是向右移动指定的位数,左边补上0,比如
10 >> 2
0000 1010 右移 >>
0000 0010
结果就是 2 了,和左移一样,int 类型右移 32 位不做处理,long 类型右移 64 位也不做处理
>>> (无符号右移)
无符号右移从名字我们可以看出,右移的时候 高位也就是符号位不做处理,右移的时候会处理,说白了就是 普通右移 正数 >> 正数,负数 >> 负数, 而无符号右移就是正数 >>> 正数,负数 >>> 正数,即无符号右移会左边补0 处理