java 的位运算符

今天在看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 处理

posted @ 2019-02-25 10:04  haoming1100  阅读(263)  评论(0编辑  收藏  举报
本文作者: haoming1100 博客链接: http://www.cnblogs.com/haoming1100 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载时必须带上原文链接!