填充可变数量的

发布于 2024-12-12 09:36:06 字数 278 浏览 1 评论 0原文

用未知(在编译时)数量填充变量的最佳方法是什么?例如,假设:

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

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

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

我可以做这样的事情:

int b = pow(2, n) - 1

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

谢谢!

What's the best way to fill a variable with an unknown (at compile time) number of ones? For example, let's say:

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

now b contains 11111 (in binary).

I can't just hard code int b = 31 because n is not known ahead of time (in my application).

I could do something like this:

int b = pow(2, n) - 1

But using a pow seems very wasteful.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

快乐很简单 2024-12-19 09:36:06

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

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

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

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

You can use left shift and then subtract 1:

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

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

The reason this works is 1 shifted left n times is the same as 2n, as each sole bit position represents a power of 2.

不念旧人 2024-12-19 09:36:06

将最高位设为 1、将最低位设为 0 的一个有趣方法是使用这个不错的技巧:

#include <limits.h>

...

int b = INT_MIN >> n;

这是有效的,因为对负数进行左移操作将保留操作的符号,并且由于 INT_MIN 是 10000....0000向左移动 n 将使 n 位变为 1,但在另一侧。

A funny way to get the highest bits as 1 and the lowest bits as zero is using this nice trick:

#include <limits.h>

...

int b = INT_MIN >> n;

This works because shift left operation on a negative number will mantain the sign of the operation, and since INT_MIN is 10000....0000 shifting it by n to the left will give you n bits to 1, but on the other side.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文