Java按位AND运算符

Java按位AND运算符,java,bit-manipulation,mask,Java,Bit Manipulation,Mask,我试图屏蔽一个整数,以便将每个字节单独分开,如下所示: int a = (0xffffffff & 0xff000000) >> 24; int b = (0xffffffff & 0x00ff0000) >> 16; int c = (0xffffffff & 0x0000ff00) >> 8; int d = 0xffffffff & 0x000000ff; b、 c和d给出了正确的

我试图屏蔽一个整数,以便将每个字节单独分开,如下所示:

     int a = (0xffffffff & 0xff000000) >> 24;
     int b = (0xffffffff & 0x00ff0000) >> 16;
     int c = (0xffffffff & 0x0000ff00) >> 8;
     int d = 0xffffffff & 0x000000ff;
b、 c和d给出了正确的答案在这种情况下,255,然而,a继续给我-1和其他负数,无论我把它改成什么,我甚至尝试:

             int a = (0xefffffff & 0xff000000) >> 24;
它给了我-17


有人知道如何解决这个问题吗?在这个边界情况下,a给我255和其他正数?

这是因为符号扩展。如果最高位为1,则
>
以1s为单位移位。这是为了保留论点的符号。您想使用总是以0移位的
>
。或者,换班后遮罩:

int a = (0xffffffff >> 24) & 0x000000ff;

您正在进行带符号的移位,因此符号将保留

int a = (0xffffffff & 0xff000000) >>> 24; // unsigned shift.


我想您需要一个
无符号移位

这样试试


(0xffffffff&0xff000000)>>24

PS在您的第二次尝试中,您的意思是屏蔽顶部位未设置的值吗?这是
0x7fffffff
而不是
0xeffffff
我建议阅读以下内容:
int a = 0xffffffff >>> 24; // unsigned shift and all the bottom bits are lost anyway
int b = (0xffffffff >>> 16) & 0xFF;
int c = (0xffffffff >>> 8) & 0xFF;
int d = 0xffffffff & 0xFF;