在Java中value&0xff的作用是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

我有以下Java代码:

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

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

提问于
用户回答回答于

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

类似这样的理由是必要的,这byte是Java中的一种签名类型。如果你只是写道:

int result = value;

那么result最终会以价值ff ff ff fe而不是00 00 00 fe。更进一步的细微之处在于,它&被定义为仅对int值1进行操作,所以会发生什么:

  1. value被提升为intff ff ff fe)。
  2. 0xff是一个int文字(00 00 00 ff)。
  3. &被施加到得到所希望的值result

(该点是,转换int发生之前&施加操作者)。

用户回答回答于

来自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

&就像%但不是真的

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

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

00000000 00000000 00000000 11111111

和-1看起来像这样

11111111 11111111 11111111 11111111

当您执行0xFF的按位AND和从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;

请注意,如果您执行异或操作两次,结果会相同。

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;

扫码关注云+社区