Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可变填充C_C_Bit Manipulation_Bitwise Operators - Fatal编程技术网

可变填充C

可变填充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为零时,代

假设我们有一个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
为零时,代码看起来什么都没有做,当
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;
}