假设我们有一个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
,填充必须提供0xFFFFFFFFFFFFFFFF
。
答案 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代码和我的代码的性能。