gpt4 book ai didi

c - 设置 n 个最高位

转载 作者:太空狗 更新时间:2023-10-29 17:06:17 24 4
gpt4 key购买 nike

我有以下设置 N 个最高位的函数,例如set_n_high(8) == 0xff00000000000000

uint64_t set_n_high(int n)
{
uint64_t v = 0;
int i;
for (i = 63 ; i > 63 - n; i--) {
v |= (1llu << i);
}

return v;
}

现在出于好奇,在 C 中是否有任何方法可以在不使用循环(或查找表)的情况下完成相同的任务?

编辑:n = 0 和 n = 64 是要处理的情况,就像循环变量一样。

最佳答案

如果您对 n = 0 的情况没有问题,您可以将其简化为

uint64_t set_n_high(int n)
{
return ~UINT64_C(0) << (64 - n);
}

除此之外,如果您对“奇怪的类次计数”(未定义的行为,但在我的机器上工作)没问题,您可以进一步简化它

uint64_t set_n_high(int n)
{
return ~UINT64_C(0) << -n;
}

如果您对 n = 64 的情况没有问题,您可以将其简化为

uint64_t set_n_high(int n)
{
return ~(~UINT64_C(0) >> n);
}

如果使用它意味着您必须验证 n,它不会更快。否则,它可能是。

如果您对任何一种情况都不起作用感到不满意,它就会变得更加棘手。这是一个建议(可能有更好的方法)

uint64_t set_n_high(int n)
{
return ~(~UINT64_C(0) >> (n & 63)) | -(uint64_t)(n >> 6);
}

请注意,对无符号数求反是完全明确定义的。

关于c - 设置 n 个最高位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com