填写可变数量的

时间:2011-10-27 16:55:05

标签: c bit-manipulation bitwise-operators

用未知(编译时)的数量填充变量的最佳方法是什么?例如,让我们说:

int n = 5;
int b = fillwithones(5);

现在b包含11111(二进制)。

我不能只是硬编码int b = 31,因为n未提前知道(在我的应用程序中)。

我可以这样做:

int b = pow(2, n) - 1

但使用战俘似乎非常浪费。

谢谢!

2 个答案:

答案 0 :(得分:18)

您可以使用左移,然后减去1:

unsigned int b = (1U << n) - 1U;

// Broken down into steps
//  1           = 00000001b
//  1 << 5      = 00100000b
// (1 << 5) - 1 = 00011111b

其工作原因是 1左移n次 2 n 相同,因为每个唯一的位位置代表一个幂2。

答案 1 :(得分:1)

将最高位设为1并将最低位设为零的有趣方法是使用这个好方法:

#include <limits.h>

...

int b = INT_MIN >> n;

这是有效的,因为在负数上的左移操作将保持操作的符号,并且由于INT_MIN是10000 .... 0000将它向左移动n将给出n位到1,但在另一方面侧。