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
。 另一个微妙之处在于, &
被定义为只对int
值1进行操作,所以会发生什么:
-
value
被提升为int
(ff ff ff fe
)。 -
0xff
是一个int
文字(00 00 00 ff
)。 -
&
被应用以产生期望的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个位。