将 N 和 最接近N且小于N的2次元数 以及 最接近N且大于N的2次元数 转换成 二进制 对比
看图不难发现 如果将N的尾数全部置1 然后+1 可以得到大于N且最接近N的 二次元数 Max
由 Max / 2 或者 右移一位得出 小于N且最接近N的二次元数Min
思路理清了 那接下来我们动手开始撸吧~
第一步 将N的所有位置1
// 公式: 将X的第N位置1
//原理很简单 大家对下二进制就知道了 这里不过多阐述
x = x | (1 << n)
代码如下:
N|= N >> 1;
N |= N >> 2;
N |= N >> 4;
N |= N >> 8;
N |= N >> 16;
第二步 将N自增1 得到 大于N且最近就N的2次方数
++N;// 得到大于N 且 最接近N的二次方数
第三步 将N右移1位 得到 小于N且最接近N的2次方数
N>>=1;// 得到小于N 且 最近就N的二次方数
完整代码
//得到最接近 into 且大于into的二次方数
public static int get2powHigh( int into )
{
--into;//避免正好输入一个2的次方数
into |= into >> 1;
into |= into >> 2;
into |= into >> 4;
into |= into >> 8;
into |= into >> 16;
return ++into;
}
//得到最接近 into 且小于into的二次方数
public static int get2powLow(int into)
{
return get2powHigh(into) >> 1;
}