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

时间:2014-08-08 20:43:56

标签: c++ boolean bit-manipulation

我对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

有人对此有答案吗?

5 个答案:

答案 0 :(得分:7)

根据C ++标准([expr.unary.op])的§5.3.1.10,~运算符采用整数(或无范围的枚举类型)操作数,并执行整数提升,其中结果的类型为~操作是其提升的操作数的类型。这意味着首先将布尔值转换为整数(0false1true。由于您的上下文,~操作的结果将转换回布尔值: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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

在bool上应用operator~之前,将转换为int。因此~true是~int(true),它不是零。

答案 3 :(得分:1)

bool转换为int

true ==> 1
false ==> 0

int转换为bool

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

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

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

当且仅当~true == false转换为true时,您对~0的期望才有效:

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

答案 4 :(得分:0)

true转换为0x00000001。 ~执行按位否定,翻转它应用的值中的每一位。 ~0x00000001 == 0xfffffffe,非0,因此计算结果为true。类似地,false转到0x00000000,~0x00000000 == 0xffffffff转换为bool时变为真。当〜再次应用于该值时,该真值将转换回0x00000001,而不是0xffffffff,并且您将在开始时返回。