4

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

11111111.11000000

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

11110000.00000000

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

4

3 回答 3

3

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

看看你的例子中发生了什么很有启发性。 1 << wordsize - numbits1 << 12,这是00010000.00000000。回想一下-x = ~x+1,我们计算~(1 << 12) = 11101111.111111。加 1 你得到11110000.00000000.

于 2013-04-17T23:42:04.797 回答
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);

如果你运行这个,输出应该是 2^16 + 2^15 = 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 

在 for 完成后,您打印的整数值11000000 0000000098304

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

希望能帮助到你。

于 2013-04-17T23:42:58.923 回答
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 仍然会存在。如果您不需要从左侧偏移,那么您可以忽略它并去掉右移。

于 2013-04-18T00:15:56.877 回答