zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    strace命令的使用
    部署软件RDMA的步骤
    centos7上安装iptables
    在Linux中的.iso文件的处理方法
    centos7关闭自动锁屏
    SSH配置优化和慢的解决方法
    sort排序和uniq统计命令
    ansible的携带密码访问
    fabric入门
    防火墙设置本机端口转发
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12650164.html
Copyright © 2011-2022 走看看