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

11111111.11000000

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

11110000.00000000

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

===============>>#1 票数:3 已采纳

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

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

===============>>#2 票数: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的函数,它可以让您轻松检查输出是否正确。 学习按位运算符也是一项非常好的练习。

希望能帮助到你。

===============>>#3 票数: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仍然会在那里。 如果您不需要从左侧偏移,那么您可以忽略它并去除右移。

  ask by John Smith translate from so

未解决问题?本站智能推荐: