可变填充C
假设我们有一个64位的变量可变填充C,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,假设我们有一个64位的变量x,我们也知道我们实际使用了多少位这样的变量,比如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\u t padd\u输入(uint64\u t x,int nx) { uint64_t t=x&(1当msb为零时,代
x
,我们也知道我们实际使用了多少位这样的变量,比如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\u t padd\u输入(uint64\u t x,int nx)
{
uint64_t t=x&(1当msb
为零时,代码看起来什么都没有做,当nx-1
中的位为零时,msb
设置为零。这不是故意的,是吗?实际上是故意的(我假设“未使用的部分”已经设置为0)。即使我们放弃这个假设,我也只需要一个我猜是“if语句”。if(msb){x |=前导的{u one}else{x&=前导的零}或者我屏蔽了不太重要的部分(仍然是and运算)。@dasblinkenlight原始问题中有一个例子。你说的“填充”到底是什么意思?好像你在尝试对extend进行签名?假设你有一个二进制数x[63]x[62]…x[nx-1]x[nx-2]…x[0]
,并且假设我使用的是第一个nx
数字。通过填充,我的意思是分配x[63]…x[nx]=x[nx-1]…x[nx-1]
。第一个似乎很有趣。@user8469759-结果对两者都是一样的。这只是一个问题:如果你想要,还是你总是想做t=t-1;x=x | ~t;
,即对于t==0
这两行不会改变x
。我等待是否有人添加其他答案。但是你的第一个非常干净。
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;
}