可变填充C.

时间:2016-06-23 09:55:45

标签: c bit-manipulation bitwise-operators

假设我们有一个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。

假设我有0x7nx = 4在这种情况下无所事事。假设填充0xF,填充必须提供0xFFFFFFFFFFFFFFFF

1 个答案:

答案 0 :(得分:1)

我愿意:

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;
}

因为我似乎更清楚。

注意:我没有比较OP代码和我的代码的性能。