这是一个众所周知的函数,用于计算正面参数的两个最近功率。但是,我没有太多的经验,可以理解其背后的逻辑/理论。您愿意解释为什么以及如何工作吗?特别是,转移的选择1,2,4,8,16,如果说法范围更大,例如长期使用的是什么?为什么逻辑上的转移而不是算术转移,最后,Oring Shift thing arg arth arth''
static int lowestPowerOfTwoGreaterThan(int arg) {
arg |= (arg >>> 1);
arg |= (arg >>> 2);
arg |= (arg >>> 4);
arg |= (arg >>> 8);
arg |= (arg >>> 16);
return ++arg;
}
如果您跟踪值的更改,这真的很简单。两个功率只有一组位,例如100
,10000000
,10000000000
,这意味着两个幂sinus一个的功率是一系列的序列,例如10000 - 1 = 1111
。因此,该函数的作用是将任何数字更改为一系列序列(不移动其最高1位),然后添加一个数字,例如它将10000001000111001
(66105)更改为11111111111111111
(131071),并添加一个使100000000000000000
(131072)。
首先,它自身以1位向右移动1位。这具有延长值中1
的所有运行的效果。
10000001000111001
OR 01000000100011100
=================
11000001100111101
您现在注意到每个零的运行至少有两个,因此我们可以通过将两个位而不是一个换位而不是再次转移,而是可以再次转移。
。 11000001100111101
OR 00110000011001111
=================
11110001111111111
现在,每个零的运行之前都有至少四个运行,因此我们这次转移了四个,或者再次转移。
11110001111111111
OR 00001111000111111
=================
11111111111111111
重复此逻辑,下一个偏移距离将为8,然后是16(以32位值停止),然后是32(以64位值停止此处)。在此示例中,由于已经是一系列序列,因此结果保持不变。
。此方法将任何二进制数更改为一系列序列。如前所述,将1添加1个。