用未知(编译时)的数量填充变量的最佳方法是什么?例如,让我们说:
int n = 5;
int b = fillwithones(5);
现在b包含11111(二进制)。
我不能只是硬编码int b = 31,因为n未提前知道(在我的应用程序中)。
我可以这样做:
int b = pow(2, n) - 1
但使用战俘似乎非常浪费。
谢谢!
答案 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,但在另一方面侧。