-->

是什么值0xFF的在Java中吗?(What does value & 0xff do in Jav

2019-06-14 17:23发布

我有以下的Java代码:

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

其结果是254打印时,但我不知道该代码是如何工作的。 如果&运营商简单地按位,那么为什么它不会导致字节,而不是整数?

Answer 1:

它设置result到从推杆的8位而产生的(无符号)值value中的最低8位result

在一些理由这样必要的是byte是Java中的符号类型。 如果你只是写道:

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 。



Answer 2:

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

十六进制文字为0xFF是一个等于INT(255)。 爪哇表示INT为32位。 它看起来像这样的二进制文件:

00000000 00000000 00000000 11111111

当你做一个逐位,并用这个值(255)上的任何数字,它是要掩盖(使零)所有,但数量的最低8位(将不变化)。

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

&是类似%,但没有真正的 。

为什么0xFF的? 这在((2的幂) - 1)。 所有((2的幂) - 1)(例如7,255 ...)的行为类似%运营商。

然后
在二进制,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;

复位(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

以上是有用交换两个变量,而无需临时象下面

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

要么

a ^= b ^= a ^= b;


Answer 3:

它有助于减少大量的代码。 它偶尔在其由8位的RGB值中。

其中0xff的装置24(0的)和8(1'S)00000000 00000000 00000000 11111111

它有效地掩盖了变量,因此只剩下在最后8位的值,而忽略位的其余全部

它看到在大多数情况下,试图从一个特殊格式标准的RGB值(其长度为8位)变换颜色值时等。

很好的解释看这里



Answer 4:

以32位格式系统中的十六进制值0xff表示00000000000000000000000011111111255(15*16^1+15*16^0)以十进制。 和按位&运算掩模相同的8最右边的位作为在第一操作数。



文章来源: What does value & 0xff do in Java?