C中的按位运算:从左侧设置位

时间:2013-04-17 23:35:13

标签: c bitwise-operators

给定一个像10这样的整数,我怎样才能在总共16位中写入10位(从左边开始),如下所示:

11111111.11000000

或者给出一个像4这样的整数,它会写:

11110000.00000000

谢谢,我还在学习C并且不熟悉按位操作。

3 个答案:

答案 0 :(得分:3)

-(1 << wordsize - numbits)应该这样做。

看看你的例子中发生了什么是有益的。 1 << wordsize - numbits1 << 12,即00010000.00000000。回顾-x = ~x+1,我们计算~(1 << 12) = 11101111.111111。添加1即可获得11110000.00000000

答案 1 :(得分:1)

实际上,int通常是32位。但我只是在评论中加上16位,以使其更清晰。

int i = 0; //00000000 00000000
int mask = 65536; //10000000 00000000
int retVal = 0; //00000000 00000000
int yourAmountOfBitsToOne = 2;

for(i = 0; i < yourAmountOfBitsToOne; i++){
    retVal = retVal | (mask >> i);
}

printf("%d", retVal);

如果你运行它,输出应该是216 + 215 = 98304.

<强>为什么吗

迭代0:

line 1: retVal = 00000000 00000000 | (10000000 00000000 >> 0)
line 1: retVal = 10000000 00000000

迭代1:

line 1: retVal = 10000000 00000000 | (10000000 00000000 >> 0)
line 1: retVal = 10000000 00000000 | (01000000 00000000)
line 1: retVal = 11000000 00000000 

完成后,您将打印11000000 00000000的整数值98304

现在创建一个逐位打印int retVal的函数,它可以让您轻松检查输出是否正确。学习按位运算符也是一项非常好的练习。

希望它有所帮助。

答案 2 :(得分:0)

整数通常为32位。如果你指的是短整数,那么:

unsigned short MakeMask16(unsigned short width,unsigned short offsetFromLeft)
{
    unsigned short mask = -1;
    mask <<= (sizeof(unsigned short)*8-width);
    mask >>= offsetFromLeft;
    return mask;
}

或全部在一条线上:

unsigned short MakeMask16(unsigned short width,unsigned short offsetFromLeft)
{
    return (unsigned short(-1<<(sizeof(unsigned short)*8-width)) >> offsetFromLeft);
}

请注意,如果你在右移之前没有将它投射到无符号的短路上,你认为你从左侧推开的1仍然会在那里。如果您不需要从左侧偏移,那么您可以忽略它并去除右移。