我对bitwise not
和logical not
有疑问,希望有人能为我解答。
所以我知道以下工作:
!true == false
!false == true
我认为bitwise not
可以做同样的事情,但显然不能。
假设我有一个布尔值:
bool test = true;
然后当我打印~test
时,输出为true
。
如果布尔值是
bool test = false;
然后当我打印出~test
时,输出为true
,这是预期的。但是,当我再次执行~test
时,它不会返回false
。
出于某种原因,bitwise not
无法将布尔值从true
翻转为false
。
有人对此有答案吗?
答案 0 :(得分:7)
根据C ++标准([expr.unary.op])的§5.3.1.10,~
运算符采用整数(或无范围的枚举类型)操作数,并执行整数提升,其中结果的类型为~
操作是其提升的操作数的类型。这意味着首先将布尔值转换为整数(0
为false
,1
为true
。由于您的上下文,~
操作的结果将转换回布尔值:false
0
和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
答案 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,并且您将在开始时返回。