如何获取负数的最后16位二进制数字并将它们连接起来?

Tyl*_*lly 5 c int bit-manipulation bit-shift bitwise-operators

我正在研究一些按位运算符,我想提取数字的最后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;
}
Run Code Online (Sandbox Code Playgroud)

我的思维过程是,我可以在我转换int a到一个较短,使得它看起来像FFFF,而不是FFFFFFFF我将有一个更好的时间.对我来说不幸的是,这只是打印出ffffffff变量

dbu*_*ush 5

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

您希望使用按位AND运算符(&)来屏蔽您不想要的位.这清除了任何一个操作数中清楚的位.

改变这个:

c = (0 << 16) | b;
Run Code Online (Sandbox Code Playgroud)

对此:

c = b & 0xFFFF;
Run Code Online (Sandbox Code Playgroud)

你的输出将是:

a is ffffffff
b is ffffffff
c is ffff
Run Code Online (Sandbox Code Playgroud)