【问题标题】:Bitwise not and Logic wise not: Why ~true == true and ~false == false按位不和逻辑不:为什么 ~true == true 和 ~false == false
【发布时间】:2014-08-08 20:43:56
【问题描述】:

我有一个关于bitwise notlogical not 的问题,希望有人可以为我解答。

所以我知道以下作品:

!true == false
!false == true

我认为bitwise not 可以做同样的事情,但显然不能。

假设我有一个布尔值:

bool test = true;

然后当我打印出~test 时,输出为true

如果布尔值是

bool test = false;

然后当我打印出~test 时,输出是true,这是预期的。但是,当我再次执行~test 时,它不会返回到false

由于某种原因,bitwise not 无法将布尔值从 true 翻转为 false

有人对此有答案吗?

【问题讨论】:

  • true = 非零(输入通常为 1),false = 零。 ~true = ~1 = 非零 = true。 ~false = ~0 = nonzero = true(虽然标题说的是假)
  • 听起来是一个很好的理由不将~ 应用于bool 值。真正的答案是:使用!,而不是~

标签: c++ boolean bit-manipulation


【解决方案1】:

根据 C++ 标准 ([expr.unary.op]) 的 §5.3.1.10,~ 运算符采用整数(或无作用域枚举类型)操作数并执行整数提升,其中 ~ 操作的结果类型是其提升操作数的类型。这意味着布尔值首先被转换为整数(0 用于false1 用于true)。由于您的上下文,~ 操作的结果随后将转换回布尔值:false 用于 0true 用于所有非零值。

如果您有一个布尔值x,您可以将~x 视为~static_cast<int>(x),将x = ~x 视为x = ((~static_cast<int>(x)) != 0)

因此:

bool a = false;
bool b = ~a; // b = (~static_cast<int>(a) != 0)
             // b = (~static_cast<int>(false) != 0)
             // b = (~0 != 0)
             // b = (0xffffffff != 0)
             // b = true
bool c = ~b; // c = (~static_cast<int>(b) != 0)
             // c = (~static_cast<int>(true) != 0)
             // c = (~1 != 0)
             // c = (0xfffffffe != 0)
             // c = true

【讨论】:

  • 这不回答为什么~~false true
  • @LukaRahne 绝对可以。您首先按位不为假,这将产生11...10,然后将其转换为布尔值,从而产生true。正如他解释的那样,当你去然后在true上使用~时,它会给你再次真实的。
  • @LukaRahne: ~~false 的类型为int,值为0,所以这不是真的。 schohe001 的解释似乎在谈论其他事情。您的表达式不会在 ~ 操作之间将 ~false 转换回布尔值。它只是 bool->int 转换,然后翻转位,然后再次将位翻转回原始位。我们可以在 AVR 的 GCC 中看到这一点:godbolt.org/z/h6f437ova - auto foo() { return ~~false; } 将两个 8 位寄存器加载为零,因此我们可以看到返回类型不是bool(而是int。)正如这个答案所解释的,@ 987654351@很不一样,是-2
【解决方案2】:

了解正在发生的事情的关键是意识到正在发生隐式转换~ 运算符应用于整数并返回整数,因此必须先将操作数转换为整数,然后再将结果转换为布尔值再进行赋值。 false 转换为 0,true 转换为 1。在另一个方向,0 转换为 false任何非零值 转换为 true~1 非零,因此转换为true

【讨论】:

    【解决方案3】:

    在对 bool 应用运算符 ~ 之前,会发生到 int 的转换。因此 ~true 是 ~int(true),它不为零。

    【讨论】:

      【解决方案4】:

      bool 转换为int

      true ==> 1
      false ==> 0
      

      int 转换为bool

      zero value ==> false
      non-zero value ==> true
      

      从这里开始,您的问题的答案很简单:

      ~true == ~1
      ~1 != 0
      ~1 == true
      

      当且仅当true 转换为~0 时,您对~true == false 的期望才会起作用:

      ~true == ~~0
      ~~0 == 0
      0 == false
      

      【讨论】:

        【解决方案5】:

        true 被转换为 0x00000001。 ~ 进行按位否定,翻转它所应用的值中的每一位。 ~0x00000001 == 0xfffffffe,非 0,因此计算结果为真。同样,false 转到 0x00000000,~0x00000000 == 0xffffffff,当转换为 bool 时变为 true。当再次应用 ~ 时,该真实值将转换回 0x00000001,而不是 0xffffffff,然后您又回到了起点。

        【讨论】:

          猜你喜欢
          • 2022-07-16
          • 2022-07-05
          • 2015-02-22
          • 2015-10-03
          • 1970-01-01
          • 1970-01-01
          • 2014-11-05
          • 1970-01-01
          • 2020-12-10
          相关资源
          最近更新 更多