Java左移澄清

Java左移澄清,java,bit-manipulation,Java,Bit Manipulation,我无法找出这种行为的原因。我想将字节值左移8位OxAB。然后我想把它转换成长的 byte oneByte = (byte) 0xAB; long converted = (oneByte & 0xFF) << 8; System.out.println(converted); 输出更改为-21760。我有以下问题: 0xFF的数据类型是什么 为什么按位AND with0xFF会阻止符号扩展 如果你把它向左移动8次,它正好给你-21760 因为在转换为long的过程中,最左边

我无法找出这种行为的原因。我想将字节值左移8位
OxAB
。然后我想把它转换成长的

byte oneByte = (byte) 0xAB;
long converted = (oneByte & 0xFF) << 8;
System.out.println(converted);
输出更改为-21760。我有以下问题:

  • 0xFF
    的数据类型是什么
  • 为什么按位AND with
    0xFF
    会阻止符号扩展 如果你把它向左移动8次,它正好给你-21760 因为在转换为long的过程中,最左边的位用作符号位

    long converted = onebyte & 0xFF; //gives you 171
    
    如果你向左移动8次,就会得到43776

    因为在使用按位and字节时,short和char首先转换为int,然后执行按位操作

    11111111111111111111111110101011 //byte 0xAB casted to int
    00000000000000000000000011111111 //0xFF is an int literal
    00000000000000000000000010101011 //bitwise and operation
    

    在按位and和0xFF之后,符号位被删除

    左移位的符号扩展?没有扩展该方向的标志。@DaveNewton 0xAB的位模式是1010 1011。我认为当Java将一个字节提升为一个长字节时,它使用最左边的1作为符号位。我对这种行为没有清楚的理解。哦,我明白你的意思了——我想我从来没有真正考虑过“符号扩展”,但我想是的。@sshekhar这是正确的。字节在Java中是有符号的,所以它是一个符号位,所以它得到扩展,不是通过移位,而是在移位之前扩展到
    int
    。你的
    (oneByte&0xFF)
    表达式被掩码截断为8位。但你没有说原因。@pero\u hero所以你说0xFF是整型文字,这就是为什么24位为零。但对于0xAB,它是一个字节文字,当它提升为INT时,符号位被扩展。我认为这是有道理的。非常感谢!
    long converted = onebyte & 0xFF; //gives you 171
    
    11111111111111111111111110101011 //byte 0xAB casted to int
    00000000000000000000000011111111 //0xFF is an int literal
    00000000000000000000000010101011 //bitwise and operation