Java中的值&0xff是做什么的?

我有以下Java代码:

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

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

它将result设置为将8位value放入结果的最低8位所得到的(无符号)值。

像这样的东西是必要的原因是该byte是在Java中的签名types。 如果你只是写道:

 int result = value; 

那么result将会以“ ff ff ff fe而不是“ 00 00 00 fe 。 另一个微妙之处在于, &被定义为只对int1进行操作,所以会发生什么:

  1. value被提升为intff ff ff fe )。
  2. 0xff是一个int文字( 00 00 00 ff )。
  3. &被应用以产生期望的result值。

(重点在于, 应用&运算符之前转换为int 。)

1 好吧,不是。 如果任一操作数很long ,那么&运算符也适用于long值。 但不是byte 请参阅Java语言规范,第15.22.1和5.6.2节。

来自http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff

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

 00000000 00000000 00000000 11111111 

当你在任何数字上用这个值(255)做一个明智的AND时,它将屏蔽(使ZERO)除了数字的最低8位(将原样)。

 ... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101 

&就像%,但不是真的 。

为什么0xff? 这在((2的幂)-1)中。 所有((2的幂)-1)(例如7,255 …)将performance得像%操作符。

然后
在二进制中,0是全零,而255是这样的:

 00000000 00000000 00000000 11111111 

和-1看起来像这样

 11111111 11111111 11111111 11111111 

当你做一个按位的和的0xFF和从0到255的任何值,结果是完全一样的值。 如果任何高于255的值仍然会在0-255之内。

但是,如果你这样做:

 -1 & 0xFF 

你得到

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

几位操作:(不涉及问题)

 X >> 1 = X/2 X << 1 = 2X 

检查是否设置了(1)或不是(0)

  int thirdBitTobeChecked = 1 << 2 (...0000100) int onWhichThisHasTobeTested = 5 (.......101) int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked; if(isBitSet > 0) { //Third Bit is set to 1 } 

设置(1)一个特定的位

  int thirdBitTobeSet = 1 << 2 (...0000100) int onWhichThisHasTobeSet = 2 (.......010) onWhichThisHasTobeSet |= thirdBitTobeSet; 

ReSet(0)一个特定的位

 int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011) int onWhichThisHasTobeReSet = 6 ;//(.....000110) onWhichThisHasTobeReSet &= thirdBitTobeReSet; 

XOR

请注意,如果您执行两次XOR操作,结果将是相同的值。

 byte toBeEncrypted = 0010 0110 byte salt = 0100 1011 byte encryptedVal = toBeEncrypted ^ salt == 0110 1101 byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :) 

XOR的另一个逻辑是

 if A (XOR) B == C (salt) then C (XOR) B == A C (XOR) A == B 

上面的内容对于像下面那样交换两个variables是非常有用的

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

要么

 a ^= b ^= a ^= b; 

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

其中0xff表示24(0)和8(1)00000000 00000000 00000000 11111111

它有效地掩盖了variables,所以它只留下最后8位的值,忽略所有其余的位

在尝试将颜色值从特殊格式转换为标准RGB值(长度为8位)时,这种情况最为常见。

很好的解释请看这里

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