假设我们有一个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;
}
我觉得更清楚。
注意:我没有比较操作代码和我的代码的性能。