【问题标题】:Explanation of a statement by its result [closed]通过结果解释声明[关闭]
【发布时间】:2017-11-03 20:40:30
【问题描述】:

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

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

【问题讨论】:

  • 这不是很明显吗?这是我初始化 42 整数的常用方法;)
  • @TimSchmelter 那么初始化 43 呢?
  • @HimBromBeere int x = -(~'+'|0xAB^1337); ++x; 简单本身。
  • 有趣的问题,但没有显示任何自己的能力来解决它。特别是:这对任何人有什么用处?
  • @TimSchmelter 就像几乎所有其他“我的代码为什么要这样做”的问题一样,您可以轻松地将其分解以找出答案。第一步是了解每个操作员的工作,然后弄清楚事情发生的顺序,然后逐步评估它。也许我只是编程太久了,或者我只是非常合乎逻辑,但老实说,我看不出任何给定的人至少不能一些知道从哪里开始解码.

标签: c#


【解决方案1】:

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

'+' 字符等同于整数值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)

Try online.

【讨论】:

  • 我认为这是我真正理解的关于按位运算符的第一个答案!
【解决方案2】:
  1. 评估~'+',它是'+' 的ascii 值上的二进制NOT => -44
  2. 计算0xAB^1337(二进制异或)=> 1426
  3. 计算-44|1426(二进制或)=> -42
  4. 计算-42(算术否定)=> 42

【讨论】:

    【解决方案3】:

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

     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
    

    【讨论】:

      【解决方案4】:

      转换为十六进制为手动进行二进制计算提供了一种相对简单的方法:

      • '+' 的代码是 0x2B,或二进制的 00101011
      • 0x2B 的反转位模式为 0xFFFFFFD4
      • XOR ^ 的优先级高于 OR |,因此0xAB 先与 1337 进行异或运算(1337 是 0x539
      • 异或的结果是000010101011 ^ 010100111001 = 010110010010,或者0x592
      • 0xFFFFFFD40x00000592 的按位或生成 0xFFFFFD6
      • 取反产生0x0000002A,等于十进制的42。

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多