<分区>
我知道,42 是所有问题的答案,但 42
到底是怎么得到的呢?
int x = -(~'+'|0xAB^1337); //42
标签 c#
<分区>
我知道,42 是所有问题的答案,但 42
到底是怎么得到的呢?
int x = -(~'+'|0xAB^1337); //42
最佳答案
要了解发生了什么,您应该查看此表达式中值的二进制 表示形式。但在此之前,让我们看看字符是如何转换为整数的,以及这里使用了哪些位运算符。
'+'
字符等同于整数值 43
- 您可以通过将其转换为整数或使用 Convert.ToInt32(' +')
.
0xAB
是 hexadecimal literal , 表示十进制值 171
。
最后你应该明白的是 bitwise operators :
~
按位非 - 运算符查看表达式值的二进制表示,并对其执行按位否定运算。表达式中为 1 的任何数字在结果中都会变为 0。表达式中为 0 的任何数字在结果中都会变为 1。|
按位或 - 查看两个表达式值的二进制表示并对它们执行按位或运算。任何时候任一表达式的数字中有 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)
关于c# - 通过结果解释陈述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328867/