Java之位运算

今天学习HashMap源码,看见源码里的一个方法,有点看不懂,特此一记;

/**
     * Returns a power of two size for the given target capacity.
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

上面代码是决定HashMap初始化时决定Map大小的一个方法,我搞不懂 "|=" 是什么意思?特地百度了一下。

int a = 1; //1
int b = 3; //11
int c = a | b;  //相当于  c |= ((a << 1) + 1);
System.out.println(c); //3
        
/**
 * int c = a | b; 的计算方式为
 * a 的二进制为  1
 * b 的二进制为 11
 * c 的二进制为 11 
 */

按位或的计算规则为:

1  逐位进行计算;
2  计算数的同位上值,如果均为0,则结果对应位上值为0;
3  除2中情况外,结果对应位上值为1。

解析:c = a | b,a的二进制位1,b的二进制位11,个位上都是1,及c的二进制个位为1,十位上a的二进制为0,b的二进制为1,及c的二进制位1,及c的十进制为3。

System.out.println(4 >> 2); // 4 / 2 ^ 2                     向右位移
System.out.println(16 >>> 2); // 4                           正数计算时和 >> 是一样的
System.out.println(-16 >>> 2); // 1073741820                 无符号右移
System.out.println(4 << 2); // 4 * 2 ^ 2                     向左位移

 位运算推荐阅读:https://www.cnblogs.com/liaopeng/p/8436155.html

原文地址:https://www.cnblogs.com/mxh-java/p/12650164.html