最接近2的力量

时间:2013-10-25 15:13:59

标签: c

给定无符号整数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;
}

3 个答案:

答案 0 :(得分:7)

以下是没有相对昂贵的条件语句或循环:

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; 
} 

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

return 1024;