我正在研究一些按位运算符,我想提取数字的最后16位二进制数字并用它们进行操作。我基本上希望看到像0xFFFFFFFF这样的负数,然后提取LSB FFFF
并将它们与0
连接起来,这样我最终得到零,所以它看起来像0x0000FFFF
。我只关心较小的负数,所以LSB应该是我需要的所有信息。
这是我在C中的方法:
#include <stdio.h>
int main(){
int a = -1, c = 0;
short b = (short)a;
printf("a is %x\nb is %x",a,b);
c = (0 << 16) | b;
printf("\nc is %x\n", c);
return 0;
}
我的思维过程是我可以将int a
转换为短片,使其看起来像FFFF
而不是FFFFFFFF
我会有更好的时间。对我来说不幸的是,这只会为变量打印ffffffff
答案 0 :(得分:5)
你所拥有的东西不起作用,因为按位运算符(|
)设置在任一操作数中设置的任何位。
您希望使用按位AND运算符(&
)来屏蔽您不想要的位。这清除了任何一个操作数中清楚的位。
改变这个:
c = (0 << 16) | b;
对此:
c = b & 0xFFFF;
您的输出将是:
a is ffffffff
b is ffffffff
c is ffff