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

10-13 01:16