3

给定一个无符号整数a(小于或等于1024),我需要找到一个p满足以下条件的数字:

  • 最低p >= a
  • p是 2 的幂

我确信有一个更好的解决方案,使用按位运算符。
你有更好的解决方案吗?

unsigned int closest_pow2(unsigned int a)
{
  if (a == 0 || a > 1024) return 0; //error, never happen
  if (a == 1) return 1;
  if (a == 2) return 2;
  if (a <= 4) return 4;
  if (a <= 8) return 8;
  if (a <= 16) return 16;
  if (a <= 32) return 32;
  if (a <= 64) return 64;
  if (a <= 128) return 128;
  if (a <= 256) return 256;
  if (a <= 512) return 512;
  if (a <= 1024) return 1024;
}
4

3 回答 3

8

以下是在没有相对昂贵的条件语句或循环的情况下完成的:

unsigned next_power_of_two(unsigned int x) {
   x = x - 1; 
   x = x | (x >> 1); 
   x = x | (x >> 2); 
   x = x | (x >> 4); 
   x = x | (x >> 8); 
   return x + 1; 
} 
于 2013-10-25T15:17:19.540 回答
0

从风格上讲,我不喜欢使用位运算符,因为它们会使代码更难阅读——它们对位结构的封装比其他类型的命令少得多。即使没有位运算符,代码也可以更简洁:

int pow = 1;
if (a == 0 || a > 1024) return 0;
while (pow < 2000) {
    if (a <= pow) return pow;
    pow *= 2;
}

如果您不想硬编码大于最大位数的数字(无论如何可能是更好的编码实践),您可以编写如下:

final int MAX_POSSIBLE_BIT_VALUE = 1024;

unsigned int closest_pow2(unsigned int a) {
  if (a == 0 || a > MAX_POSSIBLE_BIT_VALUE) return 0;
  int pow = 1;
  while (pow <= MAX_POSSIBLE_BIT_VALUE) {
    if (a <= pow) return pow;
    pow *= 2;
  }
  return pow;
}
于 2013-10-25T15:18:09.610 回答
0

如果这是一个技巧问题(因为我认为没有要求您必须找到最低的p >= a),那么这是一个解决方案:

return 1024;
于 2013-10-25T15:28:13.257 回答