给定一个像10这样的整数,我怎样才能在总共16位中写入10位(从左边开始),如下所示:
11111111.11000000
或者给出一个像4这样的整数,它会写:
11110000.00000000
谢谢,我还在学习C并且不熟悉按位操作。
答案 0 :(得分:3)
-(1 << wordsize - numbits)
应该这样做。
看看你的例子中发生了什么是有益的。 1 << wordsize - numbits
为1 << 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仍然会在那里。如果您不需要从左侧偏移,那么您可以忽略它并去除右移。