给定一个像 10 这样的整数,我怎么能在总共 16 位中写入 10 个 1 位(从左侧开始),如下所示:
11111111.11000000
或者给定一个像 4 这样的整数,它会写成:
11110000.00000000
谢谢,我还在学习 C 并且不熟悉按位运算。
给定一个像 10 这样的整数,我怎么能在总共 16 位中写入 10 个 1 位(从左侧开始),如下所示:
11111111.11000000
或者给定一个像 4 这样的整数,它会写成:
11110000.00000000
谢谢,我还在学习 C 并且不熟悉按位运算。
-(1 << wordsize - numbits)
应该这样做。
看看你的例子中发生了什么很有启发性。 1 << wordsize - numbits
是1 << 12
,这是00010000.00000000
。回想一下-x = ~x+1
,我们计算~(1 << 12) = 11101111.111111
。加 1 你得到11110000.00000000
.
实际上,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 00000000
是98304
。
现在创建一个逐位打印 int retVal 的函数,它可以让您轻松检查输出是否正确。而且学习位运算符也是一个很好的练习。
希望能帮助到你。
整数通常是 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 仍然会存在。如果您不需要从左侧偏移,那么您可以忽略它并去掉右移。