我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
打印时结果为254,但我不知道此代码如何工作。如果&
运算符只是按位运算符,那么为什么它不产生字节而是取整数?
Answers:
它将设置result
为通过将的8位value
放入的最低8位得到的(无符号)值result
。
之所以需要这样的原因是因为它byte
是Java中的一种签名类型。如果您刚刚写过:
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节。
0x
或0b
本身(后面没有任何数字)是非法语法。
从http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
十六进制文字0xFF等于int(255)。Java将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之间的任何值进行按位AND运算时,结果与该值完全相同。并且如果任何值大于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操作,将得到相同的值。
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
上面的内容在不使用temp的情况下交换两个变量很有用,如下所示
a = a ^ b; b = a ^ b; a = a ^ b;
要么
a ^= b ^= a ^= b;
在32位格式的系统中,十六进制值0xff
表示00000000000000000000000011111111
为255(15*16^1+15*16^0)
十进制。按位&运算符屏蔽与第一个操作数相同的最右边的8位。