Round Up To Power Of Two

这个标题应该说明了我们要做什么了,中文的意思是找出一个2^n的数,使其不小于给出的数字。举个例子吧: 如果给一个数字63,那么我需要获取不小于63的数字,但是这个数字需要是2的n次方了,所以

  • 63对应的是64(2^6)
  • 64对应的依旧是64(2^6)
  • 100对应的是128(2^7)

问题来了:

怎么快速的计算出这个结果呢?

可能首先浮现在我们眼前的可能是计算log或者一些其他的一些非位操作的算法,这些算法就不再次说明,来看一下JDK以及android的源码包中是怎么来计算的。

HashMap是一种常用的数据结果,底层是数组与链表的结合,为了能够使key尽量分布均匀,减少碰撞,HashMap的容量都是2^n,容量是2^n的另一个好处是在计算hashcode % size的时候可以使用与操作代替(实现远离可以google上查看),当我们需要构造一个指定容量(记为sizeA)的HashMap时,HashMap帮我们计算出了不小于sizeA的SizeB,sizeB满足2^n。

具体实现在android的java.util.Collections中:

 /**
     * Returns the smallest power of two >= its argument, with several caveats:
     * If the argument is negative but not Integer.MIN_VALUE, the method returns
     * zero. If the argument is > 2^30 or equal to Integer.MIN_VALUE, the method
     * returns Integer.MIN_VALUE. If the argument is zero, the method returns
     * zero.
     *
     * @hide
     */
    public static int roundUpToPowerOfTwo(int i) {
        i--; // If input is a power of two, shift its high-order bit right.

        // "Smear" the high-order bit all the way to the right.
        i |= i >>> 1;
        i |= i >>> 2;
        i |= i >>> 4;
        i |= i >>> 8;
        i |= i >>> 16;

        return i + 1;
    }

而在JDK源码中的实现:

    private static int roundUpToPowerOf2(int number) {
        // assert number >= 0 : "number must be non-negative";
        return number >= MAXIMUM_CAPACITY
                ? MAXIMUM_CAPACITY
                : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
    }

    public static int highestOneBit(int i) {
        // HD, Figure 3-1
        i |= (i >> 1);
        i |= (i >> 2);
        i |= (i >> 4);
        i |= (i >> 8);
        i |= (i >> 16);
        return i - (i >>> 1);
    }

明白原理了么?可以去小胖轩查看原理讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 14:48:04

Round Up To Power Of Two的相关文章

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '

模拟FIBERPRO偏振消光比测试仪ER2200的Python程序

版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:[email protected] 在上一篇随笔中采用VSPD.ModbusTool模拟串口.MODBUS TCP设备进行Python采集软件开发写了模拟ER2200的程序,后来进行了完善:数据进行随机变化,打印输出进行了完善. # -*- coding:utf-8 -*- u"""FIBERPRO偏振消光比测试仪ER2200模拟程序""" __author__ = 'zhengbi

数据仓库规范

一. 数据仓库层次结构规范 1.1 基本分层结构 系统的信息模型从存储的内容方面可以分为,STAGE接口信息模型.ODS/DWD信息模型,MID信息模型.DM信息模型.元数据信息模型. 在各个信息模型中存储的内容如下描述: 1)        SRC接口层信息模型:提供业务系统数据文件的临时存储,数据稽核,数据质量保证,屏蔽对业务系统的干扰,对于主动数据采集方式,以文件的方式描述系统与各个专业子系统之间数据接口的内容.格式等信息.与该模型对应的数据是各个专业系统按照该模型的定义传送来的数据文件.

oracle表空间使用率统计查询

今天发现有一张采样表从1月5号开始不记录数据了,所以想查看一下表空间使用率,在网上零零散散找了很多资料,现在记录如下,也不知道哪一个最准确.还有一个就是网上拷贝的sql代码格式太乱了,不好看,找到一个在线格式化工具. 参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使

oracle表空间使用率 脚本

参考文献 文献1:http://blog.itpub.net/24104518/viewspace-730682,字符有格式,需要清理一下 文献2:http://www.cnblogs.com/fengyun627/archive/2009/07/27/1532551.html 文献3:http://blog.csdn.net/hproc/article/details/7372265 sql语句格式化:http://web.chacuo.net/formatsql 参考1 --查询表空间使用情

Delphi Math里的基本函数,以及浮点数比较函数(转)

源:Delphi Math里的基本函数,以及浮点数比较函数 Delphi里的好东西太多,多到让人觉得烦.这种感觉就是当年打游戏<英雄无敌3>,改了钱以后,有钱了每天都要造建筑,明明是好事,可是让人觉得烦. 先记录下来,以后再回来加强对Math单元的研究,不必再自己发明函数去比较浮点数了- 1.Ceil function Ceil(const X: Extended):Integer;:按正无穷大方向四舍五入一个变量.例如: Ceil(-2.8) = -2; Ceil(2.8) = 3; Cei

(转)oracle表空间使用率统计查询

转自:http://www.cnblogs.com/xwdreamer/p/3511047.html 参考文献 文献1:http://blog.itpub.net/24104518/viewspace-730682,字符有格式,需要清理一下 文献2:http://www.cnblogs.com/fengyun627/archive/2009/07/27/1532551.html 文献3:http://blog.csdn.net/hproc/article/details/7372265 sql语

梯度寻优与logistic算法

一.一些基本概念 最优化:在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优.高中学过的线性规划就是一类典型的最优化问题. 凸集:在集合空间中,凸集就是一个向四周凸起的图形.用数学语句描述就是:集合边界任意两点连线上的所有点都在这个集合内部. 超平面:能够用于切割已给集合的点集.数学公式为$X={x|c^T=z}$.它的意义在于能够将一个凸集分为两部分. 举例说明.对于二维空间,用一条直线划分给定的散点,则有$y - ax - b = 0 $.它就是一个超平面,“超”在b这个

Oracle数据库常用SQL函数

1.SQL函数的概念: 函数一般是在数据上执行的,它给数据的转换和处理提供了方便.只是将取出的数据进行处理,不会改变数据库中的值.(类似于java中的方法但函数只是将数据库中的数据取出(复制)到函数中进行运算,并不会修改数据库中的数据) 2.Sql函数可以分为组函数和单行函数. –单行函数对单个数值进行操作,并返回一个值–组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句 3.单行函数的分类: 单行函数分为字符函数.数字函数.日期