c - 可变填充C

扫码查看

假设我们有一个64位的变量x,我们也知道我们实际使用了多少位,比如1 <= nx <= 64 ,所以最后一位在nx - 1位置。在剩余的64 - nx中执行最后一位填充的最快方法是什么?
我想试试(伪代码/C):

uint64_t padd_input(uint64_t x, int nx) {
    assert(0 < nx && nx <= 64);
    msb = (x & (1ULL<<(nx - 1))) != 0ULL; //or (x >> (nx - 1)) & 0x1ULL;
    x |= ((msb<<(64 - nx)) - msb)<<nx;
    return x;
}

所有的轮班/掩蔽都是多余的吗?还是有更聪明的方法来实现同样的目标?
我做了一个我想要实现的例子,假设未使用的部分已经设置为0。
假设我有0x7,在这种情况下没有什么可做的。相反,假设nx = 4填充必须提供0xF

最佳答案

我会做:

uint64_t padd_input(uint64_t x, int nx)
{
    uint64_t t = x & (1ULL << (nx-1));
    t = t - 1;
    x = x | ~t;
    return x;
}

或者也许
uint64_t padd_input(uint64_t x, int nx)
{
    uint64_t t = x & (1ULL << (nx-1));
    if (t)
    {
        t = t - 1;
        x = x | ~t;
    }
    return x;
}

我觉得更清楚。
注意:我没有比较操作代码和我的代码的性能。

07-24 09:45
查看更多