什么是价值与价值;0xff在Java中做什么?

什么是价值与价值;0xff在Java中做什么?,java,integer,byte,bitwise-and,Java,Integer,Byte,Bitwise And,我有以下Java代码: byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned) int result = value & 0xff; 打印时的结果是254,但我不知道这段代码是如何工作的。如果&运算符只是按位的,那么为什么它不产生一个字节而不是一个整数?它将结果设置为(无符号)值,该值是将值的8位放在结果的最低8位后得到的 这样做之所以必要,是因为byte在Java中是一种有符号类型。如果你只是写: int

我有以下Java代码:

byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;

打印时的结果是254,但我不知道这段代码是如何工作的。如果
&
运算符只是按位的,那么为什么它不产生一个字节而不是一个整数?

它将
结果
设置为(无符号)值,该值是将
值的8位
放在
结果
的最低8位后得到的

这样做之所以必要,是因为
byte
在Java中是一种有符号类型。如果你只是写:

int result = value;
然后,
result
将以值
ff ff fe
而不是
00fe
结束。另一个微妙之处是
&
被定义为仅对
int
值1进行操作,因此发生的情况是:

  • 被提升为
    int
    ff ff ff fe
  • 0xff
    是一个
    int
    文本(
    00ff
  • 应用
    &
    结果
    生成所需的值
  • (关键是在应用
    &
    运算符之前,会发生到
    int
    的转换。)

    嗯,不完全是。如果任一操作数为
    ,则
    &
    运算符也处理
    值。但不是在
    字节上。请参阅Java语言规范的章节和

    十六进制文字0xFF是一个相等的整数(255)。Java将int表示为32位。它在二进制中看起来像这样:

    00000000 00000000 00000000 11111111
    
    当您按位执行此操作时,在任何数字上使用此值(255),它将屏蔽(置零)除数字的最低8位之外的所有位(将保持原样)

    &类似于%,但不是

    为什么是0xff?这是在((2的幂)-1)中。 所有((2的幂)-1)(例如7255…)的行为类似于%operator

    然后
    在二进制中,0为,全部为零,255如下所示:

    00000000 00000000 00000000 11111111
    
    和-1看起来像这样

    11111111 11111111 11111111 11111111
    
    当您对0xFF和0到255之间的任何值进行位AND运算时,结果与该值完全相同。如果任何值高于255,结果仍将在0-255范围内

    但是,如果您这样做:

    -1 & 0xFF
    
    你得到

    00000000 00000000 00000000 11111111
    ,它不等于原始值-1(
    11111111
    十进制为255)


    多几位操作:(与问题无关)

    使用XOR的另一个逻辑是

    if     A (XOR) B == C (salt)
    then   C (XOR) B == A
           C (XOR) A == B
    
    上面的内容对于交换两个没有临时变量的变量很有用,如下所示

    a = a ^ b; b = a ^ b; a = a ^ b;
    


    它有助于减少大量代码。它偶尔用于由8位组成的RGB值

    其中0xff表示24(0)和8(1)类似
    00000000000000000000000000111111

    它有效地屏蔽了变量,因此它只保留最后8位中的值,而忽略所有其余的位

    在尝试将颜色值从特殊格式转换为标准RGB值(8位长)的情况下最常见


    在32位格式系统中,十六进制值
    0xff
    表示
    00000000000000000000000011111111
    ,即
    255(15*16^1+15*16^0)
    。并且按位&运算符屏蔽与第一个操作数相同的8个最右边的位

    还有look@Bit操作,在这个符号中x是什么意思?x不是一个数字或十六进制数?@KazRodgers-前缀
    0x
    (或
    0x
    )告诉Java后面的整数文本应该解释为十六进制(以16为基数)。Java还支持八进制文字的裸
    0
    前缀和二进制文字的
    0b
    (或
    0b
    )前缀。有关整数文本的详细信息,请参阅。下面的文本是什么?例如,如果我有0x3fa。3fa是被翻译成文字数字的部分,0x指出“这是一个十六进制数字”@泰德霍普?@KazRodgers-没错。请注意,
    0x
    0b
    本身(后面没有任何数字)在Java中是非法语法。@DmitryMinkovsky-八位中的十六进制位模式
    fe
    ,二的补码对应于十进制值−2.要保留该值,
    Integer.valueOf(byte)
    需要生成
    ff ff-fe
    (−2在32位,2的补码),而不是
    00FE
    (十进制值254)。这种转换(从
    byte
    value
    fe
    int
    value
    ff-ff-fe
    )被称为Java语言规范,是Java语言规范的一部分。
    value&0xff
    的目的是撤销符号扩展(即,模拟零扩展,Java没有)。您能再解释一下吗?我将代码复制到Eclipse。它警告我“类型不匹配:无法从int转换为byte”。如果更改为int值=0xfe@本成应为
    字节值=(字节)0xfe
    
     int thirdBitTobeChecked =   1 << 2   (...0000100)
     int onWhichThisHasTobeTested = 5     (.......101)
    
     int isBitSet = onWhichThisHasTobeTested  & thirdBitTobeChecked;
     if(isBitSet > 0) {
      //Third Bit is set to 1 
     } 
    
     int thirdBitTobeSet =   1 << 2    (...0000100)
     int onWhichThisHasTobeSet = 2     (.......010)
     onWhichThisHasTobeSet |= thirdBitTobeSet;
    
    int thirdBitTobeReSet =   ~(1 << 2)  ; //(...1111011)
    int onWhichThisHasTobeReSet = 6      ;//(.....000110)
    onWhichThisHasTobeReSet &= thirdBitTobeReSet;
    
    byte toBeEncrypted = 0010 0110
    byte salt          = 0100 1011
    
    byte encryptedVal  =  toBeEncrypted ^ salt == 0110 1101
    byte decryptedVal  =  encryptedVal  ^ salt == 0010 0110 == toBeEncrypted :)
    
    if     A (XOR) B == C (salt)
    then   C (XOR) B == A
           C (XOR) A == B
    
    a = a ^ b; b = a ^ b; a = a ^ b;
    
    a ^= b ^= a ^= b;