我有以下功能可以设置 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/