Value & 0xff 在 Java 中做什么?

我有以下 Java 代码:

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

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

138563 次浏览

它将 result设置为(无符号的)值,这是将 value的8位放在 result的最低8位中得到的结果。

The reason something like this is necessary is that byte is a signed type in Java. If you just wrote:

int result = value;

那么 result最终的值将是 ff ff ff fe而不是 00 00 00 fe。更微妙的是,&被定义为仅在 int1上运行,因此发生的情况是:

  1. value被提升为 int(ff ff ff fe)。
  2. 0xffint文字(00 00 00 ff)。
  3. 应用 &result产生所需的值。

(关键是转换到 int发生 之前,应用 &操作符。)

1不完全是。如果操作数是 ABC1,那么 ABC0操作符也会处理 ABC1值。但不是在 byte上。请参阅 Java 语言规范,部分“ a href = “ http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html # jls-15.22.1”rel = “ noReferrer”> 15.22.1 和“ a href = “ http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html # jls-5.6.2”rel = “ noReferrer”> 5.6.2 。

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

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

00000000 00000000 00000000 11111111

当您对任何数字使用这个值(255)进行一点明智的 AND 操作时,它会屏蔽(使用 ZERO)除了数字的最低8位之外的所有内容(将按原样进行)。

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

& is something like % but not 真的.

而且为什么0xff? this in ((幂2)-1)。 所有((2的幂)-1)(例如7,255...)的行为类似于% 运算符。

Then
在二进制中,0是,所有的0,255看起来像这样:

00000000 00000000 00000000 11111111

-1看起来像这样

11111111 11111111 11111111 11111111

When you do a bitwise AND of 0xFF and any value from 0 to 255, the result is the exact same as the value. And if any value higher than 255 still the result will be within 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;

重置(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

The above is useful to swap two variables without temp like below

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

或者

a ^= b ^= a ^= b;

它有助于减少大量的代码。它偶尔被用于 RGB 值,其中包括8位。

其中0xff 的意思是 24(0)和8(1),就像 00000000 00000000 00000000 11111111

It effectively masks the variable so it leaves only the value in the last 8 bits, and ignores all the rest of the bits

It’s seen most in cases like when trying to transform color values from a special format to standard RGB values (which is 8 bits long).

很好的解释看这里

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