C 如何获取负数的最后16位二进制数字并将其串联?

C 如何获取负数的最后16位二进制数字并将其串联?,c,int,bit-manipulation,bitwise-operators,bit-shift,C,Int,Bit Manipulation,Bitwise Operators,Bit Shift,我正在研究一些位运算符,我想提取一个数字的最后16位二进制数字,并对它们进行运算。我基本上希望看到一个负整数,比如0xFFFFFF,然后提取LSBFFFF,并将它们与0连接起来,这样我就得到了一个零,看起来像0x0000FFFF。我只关心较小的负数,所以LSB应该是我需要的所有信息 以下是我在C中的方法: #include <stdio.h> int main(){ int a = -1, c = 0; short b = (short)a; printf(

我正在研究一些位运算符,我想提取一个数字的最后16位二进制数字,并对它们进行运算。我基本上希望看到一个负整数,比如0xFFFFFF,然后提取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 main(){
int a=-1,c=0;
短b=(短)a;
printf(“a是%x\nb是%x”,a,b);

c=(0您所拥有的不起作用,因为按位OR运算符(
|
)设置了在任一操作数中设置的任何位

要使用逐位AND运算符(
&
)屏蔽不需要的位。这将清除任一操作数中的任何清除位

更改此项:

c = (0 << 16) | b;
您的输出将是:

a is ffffffff
b is ffffffff
c is ffff

强制转换
(短)不需要
,因为任何较宽的值都将自动截断down@L谢谢。当涉及到位操作时,有什么理由使用short吗?在某些情况下需要short,但在这种情况下不需要。所以对于16 MSB,我会说
c=b&0xFFFF0000
?@user3470987几乎可以。这将为您提供
0xFFFF0000
。如果您想要
0x0000FFFF
您必须执行
c=(unsigned int)(b&0xFFFF0000)>>16
。需要强制转换以防止
1
位从左侧移入的可能性。
a is ffffffff
b is ffffffff
c is ffff