结果声明的说明

Tos*_*shi 23 c#

我知道,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)

在线试试.

  • 我认为这是关于按位运算符的第一个答案,我实际上已经理解了所有这些! (2认同)

Adr*_*ian 15

  1. 评估~'+',这是二进制不在ascii值'+'=> -44
  2. 评估0xAB^1337(二进制XOR)=> 1426
  3. 评估-44|1426(二进制OR)=> -42
  4. 评估-42(算术否定)=> 42


Dmi*_*nko 8

好吧,让我们一步一步解码:

 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)