我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
打印时结果是254,但我不知道这段代码是如何工作的。如果&
运算符只是按位运算,那为什么它不会产生一个字节而是一个整数呢?
答案 0 :(得分:152)
它将result
设置为将value
的8位置于result
的最低8位所得的(无符号)值。
这样的必要原因是byte
是Java中的签名类型。如果您刚刚写道:
int result = value;
然后result
最终会使用值ff ff ff fe
而不是00 00 00 fe
。更进一步的细微之处在于&
被定义为仅在int
值 1 上运行,所以会发生什么:
答案 1 :(得分:45)
来自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
&安培;是%,但不是really。
为什么0xff?这个((2的幂) - 1)。 全部((2的幂) - 1)(例如7,255 ......)的行为类似于%operator。
然后
在二进制中,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;
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;
OR
a ^= b ^= a ^= b;
答案 2 :(得分:4)
它有助于减少大量代码。它偶尔用于由8位组成的RGB值。
其中0xff表示 24(0&#39; s)和8(1&#39; s),如00000000 00000000 00000000 11111111
它有效地屏蔽变量,因此它只留下最后8位的值,并忽略所有其余的位
在尝试将颜色值从特殊格式转换为标准RGB值(长度为8位)时,大多数情况都会出现。