按位不是逻辑明智不是:为什么~true == true和~false == false

XIA*_*TAO 2 c++ boolean bit-manipulation

我对一个问题bitwise not,并logical not和希望有人能回答这个问题对我来说.

所以我知道以下工作:

!true == false
!false == true
Run Code Online (Sandbox Code Playgroud)

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

假设我有一个布尔值:

bool test = true;
Run Code Online (Sandbox Code Playgroud)

然后当我打印出来时~test,输出是true.

如果布尔值是

bool test = false;
Run Code Online (Sandbox Code Playgroud)

然后当我打印输出时~test,输出true是预期的.但是,当我再做一次~test时,它不会再回来了false.

由于某种原因,bitwise not无法将布尔值从中翻转truefalse.

有没有人有这个答案?

jot*_*tik 7

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

如果你有一个布尔值x,你可以想到~xas ~static_cast<int>(x)x = ~xas 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
Run Code Online (Sandbox Code Playgroud)

  • @LukaRahne绝对可以.你首先按位而不是假,它将产生`11 ... 10`,然后将它转换为布尔值,从而得到'true`.正如他解释的那样,当你去使用'~`对'true`时,它会再次给你真实. (2认同)