求一个整数n,最近的2的次方值m;m>n

在看HashMap源码的是否发现了一个很好玩的方法:
java.util.HashMap.tableSizeFor ;如题,求最近的2的次方值
一下为对这个方法的具体分析和注释:

	/**
	 * int类型,2的最大整数次方(2的30次方)值
	 */
	public static final int MAXIMUM_CAPACITY = 1 << 30;

	/**
	 * 根据一个整数n,取到 最近的、大于等于n的 2的整数次方;<br>
	 * 例如:n<0,返回1<br>
	 * n=0, 返回1;<br>
	 * n=1 返回1;<br>
	 * n=3返回4<br>
	 * ...<br>
	 * int型数据最大的的2的整数次方为2的30次方,则结果的返回值最大为2的30次方<br>
	 * 
	 * ;实现原理:<br>
	 * 00000000,00000000,00000000,10000001;传入参数n,(129)则n的二进制表示里,从左到右至少能遇到一个1:<br>
	 * 00000000,00000000,00000000,10000000;要求传入128返回128,无这一步会导致返回256<br>
	 * 00000000,00000000,00000000,11000000;n|=n>>>1将n右移1位,然后与n按位或,则至少左到右至少能遇到2个1;<br>
	 * 00000000,00000000,00000000,11110000;n|=n>>>2将n右移2位,然后与n按位或,则至少左到右至少能遇到4个1;<br>
	 * 00000000,00000000,00000000,11111111;n|=n>>>4将n右移4位,然后与n按位或,则至少左到右至少能遇到8个1;<br>
	 * 00000000,00000000,00000000,11111111;n|=n>>>4将n右移8位,然后与n按位或,则至少左到右至少能遇到16个1;没有达到,说明结果没有这么多位<br>
	 * 00000000,00000000,00000000,11111111;n|=n>>>4将n右移16位,然后与n按位或,则至少左到右至少能遇到32个1;没有达到,说明结果没有这么多位<br>
	 * 00000000,00000000,00000001,00000000;n=n+1,将n+1,即得到我们需要的结果
	 * 
	 * @param n
	 * 
	 */
	public static final int tableSizeFor(int n) {
		System.out.println("n     :" + Integer.toBinaryString(n));
		n = n - 1;
		System.out.println("n-1   :" + Integer.toBinaryString(n));
		n |= n >>> 1;
		System.out.println("n>>>1 :" + Integer.toBinaryString(n));
		n |= n >>> 2;
		System.out.println("n>>>2 :" + Integer.toBinaryString(n));
		n |= n >>> 4;
		System.out.println("n>>>4 :" + Integer.toBinaryString(n));
		n |= n >>> 8;
		System.out.println("n>>>8 :" + Integer.toBinaryString(n));
		n |= n >>> 16;
		System.out.println("n>>>16:" + Integer.toBinaryString(n));
		n = (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
		System.out.println("n     :" + Integer.toBinaryString(n));
		System.out.println(n);
		return n;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章