c# - 通过结果解释陈述

标签 c#

<分区>

我知道,42 是所有问题的答案,但 42 到底是怎么得到的呢?

int x = -(~'+'|0xAB^1337); //42

最佳答案

要了解发生了什么,您应该查看此表达式中值的二进制 表示形式。但在此之前,让我们看看字符是如何转换为整数的,以及这里使用了哪些位运算符

'+' 字符等同于整数值 43 - 您可以通过将其转换为整数或使用 Convert.ToInt32(' +').

0xABhexadecimal 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)

Try online .

关于c# - 通过结果解释陈述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328867/

相关文章:

c# - 有没有一种方法可以为 session 设置上下文(即,一次调用我的 API)而不是为整个应用程序域设置上下文? (ASP.NET)

c# - 来自 yielding 的 ienumerable 是否可以为空?

c# - 如何在Miniprofiler for asp.net core 2.0中禁用加载静态文件的显示

c# - 获取所有模型类型

c# - 关于 Entity Framework 和事务的问题

c# - Obsolete 属性的使用

c# - 创建 C++ DLL,然后在 C# 中使用它

c# - 在 .NET 中从 YouTube 获取 FLV

c# - 创建 Window 时出现 BindingExpression 路径错误(尚未绑定(bind) VM)

c# - MVC 3 不在区域下寻找 View