随笔03 如何让二进制编码第一次出现一的以后位置都变为一

该博客讨论了如何将一个大于最小初始化容量8且不是2的整次方的数转换为其最接近的二次幂。通过使用位运算,如右移和按位或,将数字的二进制表示中第一个1之后的所有0变为1,然后加1,从而得到目标容量。这种方法确保了找到比原数大的最小二次幂。在Java的ArrayDeque类中,这种计算用于确定合适的容量。
摘要由CSDN通过智能技术生成

感觉应该是这样。加入现在这个数不是二的整次方,那么就这样让他变成2的整次方。
前提条件是这个是大于最小初始化容量8
还有一个前提,就是用二进制表示这个数,比如说是
分两种情况
a.0000 0000 0000 0000 0000 0000 0100 0000
b.0000 0000 0000 0000 0000 0000 0110 0000
第一个1出现在第26位,那么要做的就是

  1. 先把第27-32的0 全部替换位1,
  2. 用上边这个数+1

前置知识:

0|1=1
1|0=1
0|0=0
1|1=1

所以第一步操作,就相当于把最高位上的1,做了(1+2+4+8+16) 31次复制操作,相当于第26位的1复制到了27-32位上。然后加一就是,比这个数大的最小的二次幂。

java.util.ArrayDeque#calculateSize

private static int calculateSize(int numElements) {
        int initialCapacity = MIN_INITIAL_CAPACITY;
        // Find the best power of two to hold elements.
        // Tests "<=" because arrays aren't kept full.
        if (numElements >= initialCapacity) {
            initialCapacity = numElements;
            initialCapacity |= (initialCapacity >>>  1);
            initialCapacity |= (initialCapacity >>>  2);
            initialCapacity |= (initialCapacity >>>  4);
            initialCapacity |= (initialCapacity >>>  8);
            initialCapacity |= (initialCapacity >>> 16);
            initialCapacity++;

            if (initialCapacity < 0)   // Too many elements, must back off
                initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
        }
        return initialCapacity;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值