dag*_*und 91 java byte integer bitwise-and
我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Run Code Online (Sandbox Code Playgroud)
打印时结果是254,但我不知道这段代码是如何工作的.如果&
运算符只是按位,那么为什么它不会产生一个字节而是一个整数呢?
Ted*_*opp 159
它设置result
为(无符号)值,将8位置value
于最低8位result
.
这样的事情是必要的,因为它byte
是Java中的签名类型.如果你刚才写道:
int result = value;
Run Code Online (Sandbox Code Playgroud)
然后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节.
Kan*_*mar 48
来自http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
十六进制文字0xFF是一个等于int(255).Java将int表示为32位.二进制看起来像这样:
00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)
当您对任何数字使用此值(255)进行一点点明智的AND时,它将屏蔽(生成ZERO)除了数字的最低8位(将按原样).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
Run Code Online (Sandbox Code Playgroud)
&是像%,但不是真的.
为什么是0xff?这个((2的幂) - 1).全部((2的幂) - 1)(例如7,255 ......)将表现得像%运算符.
然后
在二进制中,0是全零,255看起来像这样:
00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)
-1看起来像这样
11111111 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)
当您执行0xFF的按位AND和0到255之间的任何值时,结果与值完全相同.如果任何高于255的值仍然结果将在0-255之内.
但是,如果你这样做:
-1 & 0xFF
Run Code Online (Sandbox Code Playgroud)
你得到
00000000 00000000 00000000 11111111
,它不等于-1的原始值(11111111
十进制为255).
几点操作:(与问题无关)
X >> 1 = X/2
X << 1 = 2X
Run Code Online (Sandbox Code Playgroud)
检查任何特定位是否设置(1)或不设置(0)
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
Run Code Online (Sandbox Code Playgroud)
设置(1)特定位
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
Run Code Online (Sandbox Code Playgroud)
重新设置(0)特定位
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
Run Code Online (Sandbox Code Playgroud)
XOR
请注意,如果执行两次XOR运算,将产生相同的值.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
Run Code Online (Sandbox Code Playgroud)
XOR的另一个逻辑是
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
Run Code Online (Sandbox Code Playgroud)
以上内容对于交换两个没有temp的变量非常有用,如下所示
a = a ^ b; b = a ^ b; a = a ^ b;
Run Code Online (Sandbox Code Playgroud)
要么
a ^= b ^= a ^= b;
Run Code Online (Sandbox Code Playgroud)