Bitwise not和Logic wise not:为什么~true == true和~false == false

Bitwise not and Logic wise not: Why ~true == true and ~false == false

本文关键字:true false not Logic wise Bitwise 为什么      更新时间:2023-10-16

我有一个关于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

有人知道这个问题的答案吗?

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

如果你有一个布尔值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

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

~1不为零,因此转换为true

在对bool型应用~操作符之前,要先进行到int型的转换。因此~true为~int(true),不为零。

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

true被转换为0x00000001。~按位否定,翻转它所应用的值中的每一位。~0x00000001 == 0xfffffffe,非0,因此求值为true。类似地,false变为0x00000000,而~0x00000000 == 0xffffffff,当转换为bool时变为true。当~再次应用于该真值时,它被转换回0x00000001,而不是0xffffffff,并且您又回到了起点。