使用位twiddling计算比参数大于参数的最接近功率的说明



这是一个众所周知的函数,用于计算正面参数的两个最近功率。但是,我没有太多的经验,可以理解其背后的逻辑/理论。您愿意解释为什么以及如何工作吗?特别是,转移的选择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;
}

如果您跟踪值的更改,这真的很简单。两个功率只有一组位,例如1001000000010000000000,这意味着两个幂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个。

最新更新