我知道,42是一切的答案,但这是怎么回事42
?
int x = -(~'+'|0xAB^1337); //42
Run Code Online (Sandbox Code Playgroud)
Ser*_*kiy 29
要了解发生了什么,您应该查看此表达式中值的二进制表示.但在此之前,让我们看看字符如何转换为整数以及这里使用的是按位运算符.
'+'
character等价于整数值43
- 您可以通过将其强制转换为整数或使用来检查它Convert.ToInt32('+')
.
0xAB
是十六进制文字,表示十进制值171
.
你应该在这里理解的最后一件事是按位运算符:
~
按位NOT - 运算符查看表达式值的二进制表示,并对其执行按位求反运算.表达式中任何1的数字在结果中变为0.表达式中任何0的数字在结果中变为1.|
按位OR - 查看两个表达式的值的二进制表示,并对它们执行按位OR运算.每当任何一个表达式的数字为1时,结果将在该数字中有1.否则,结果将在该数字中为0.^
按位异或 - 查看两个表达式的值的二进制表示,并对它们执行按位异或运算.当一个且只有一个表达式的数字为1时,结果在该数字中为1.否则,结果在该数字中为0.现在所有表情看起来都像-(NOT(43) OR (171 XOR 1337))
.让我们转到这些数字和操作的二进制表示:
Binary | Decimal | Comments
00000000000000000000000000101011 | 43 | '+'
11111111111111111111111111010100 | -44 | NOT 43 // bits are inverted
00000000000000000000000010101011 | 171 | 0xAB
00000000000000000000010100111001 | 1337 |
00000000000000000000010110010010 | 1426 | 171 XOR 1337 // different bits produce 1
11111111111111111111111111010100 | -44 | NOT 43
00000000000000000000010110010010 | 1426 | 171 XOR 1337
11111111111111111111111111010110 | -42 | -44 OR 1426 // 0 only if both bits are 0
00000000000000000000000000101010 | 42 | -(-42)
Run Code Online (Sandbox Code Playgroud)
在线试试.
Adr*_*ian 15
~'+'
,这是二进制不在ascii值'+'
=> -440xAB^1337
(二进制XOR)=> 1426-44|1426
(二进制OR)=> -42-42
(算术否定)=> 42好吧,让我们一步一步解码:
int x = -(~'+'|0xAB^1337) ==
-((~'+') | 0xAB ^ 1337) == // '+' is char with ASCII code 43
-((~43)) | 0xAB ^ 1337) ==
-(0xFFFFFFD4 | 0xAB ^ 0x539) ==
-(0xFFFFFFD6) == // negation is binary complement + 1
(~0xFFFFFFD6 + 1) ==
42
Run Code Online (Sandbox Code Playgroud)