Bitwise not和Logic wise not:为什么~true == true和~false == false
Bitwise not and Logic wise not: Why ~true == true and ~false == false
我有一个关于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
。
有人知道这个问题的答案吗?
根据c++标准([expr.unary.op])§5.3.1.10,~
运算符接受整型(或无作用域枚举类型)操作数,并执行整型提升,其中~
运算符的结果类型是其提升的操作数的类型。这意味着布尔值首先被转换为整数(0
用于false
, 1
用于true
)。由于您的上下文,~
操作的结果随后被转换回布尔值:0
为false
,所有非零值为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,并且您又回到了起点。
- Arduino-C++ bool 不会从 false 变为 true
- 如何使用boost定义布尔类,可能的值应该是TRUE或FALSE?
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- MFC 的 OnInit() 函数中的返回 true 和返回 false 有什么区别
- std::is_array 当它应该返回 false 时返回 true
- 如果BOOL仅从false到true一次,我可以避免锁定布尔
- `如果constexpr(false)`始终评估为true
- 是否应在分配时将布尔值截断为 true 或 false
- 我想返回 True/False 关于值是否在一组值中
- 尝试将字符串变量转换为布尔值会导致 "true" 和 "false" 都等于 0
- C 程序,用于分级多个True或False测试
- true/false功能如果存在总和
- 查找n连续字符的函数返回true/false
- 我正在尝试创建一个函数,如果一个元素在向量中,则返回 true/false,但我收到错误
- 将 true/false 分配给 std::string:这是怎么回事?
- 如果数据类型为整数值或双数值,则当c++返回true/false时
- 如果某个条件语句中的某些内容导致该条件语句不再为true/false,则该语句是否停止执行
- bool递归函数中的true/false优先级
- c++ bool返回0 1而不是true false
- While循环为true false,不加增量