C++中bool类型的位运算与逻辑运算是否等价?
C++布尔类型的逻辑运算与位运算疑问
C++提供了针对true/false值的逻辑运算符:!a、a && b、a || b;同时也有适用于整数类型的位运算符:~a、a & b、a | b、a ^ b、a << N、a >> N,以及对应的原地赋值运算符:a &= b、a |= b、a ^= b、a <<= b、a >>= b。
我存在这样的困惑:位运算可能会操作bool类型中与真假值无关的位,甚至执行不必要的位操作。由此猜测bool类型的位移位运算行为是未定义的,进而怀疑所有位运算是否都能合法作用于bool类型。
核心疑问
- 对于bool类型,以下等式是否成立?
~a == !aa && b == a & ba || b == a | b
- 位运算能否合法作用于bool类型?
a &= b和a |= b是否始终等价于a = a && b和a = a || b?- 是否存在bool类型的原地异或写法(即
a ^= b是否等价于a = a ^ b?)
问题解答
1. 等式是否成立?
~a == !a:不成立。C++中bool参与位运算时会被隐式提升为int:true对应1,false对应0。~1的结果是-2(补码表示),而!1结果为false(即0);~0结果为-1,!0结果为true(即1),两者数值与布尔含义均不匹配。a && b == a & b:仅最终布尔结果可能一致,但运算逻辑完全不同。&&是短路求值:若a为false,则不会计算b;而&是位运算,会先计算两边的值再执行操作。不能认为二者等价。a || b == a | b:同理,||是短路求值,a为true时不会计算b;|则会强制计算两边的值。仅当忽略短路特性时,最终布尔结果可能相同,但二者并非等价运算。
2. 位运算能否合法作用于bool类型?
根据C++标准,bool参与位运算时会被隐式提升为int,运算结果为int类型,赋值回bool时会转换为true(非零)或false(零),大部分位运算都是合法的。
仅位移位运算存在特殊情况:若N大于等于int的位数,a << N或a >> N的行为是未定义的;若N在合法范围内,运算本身合法,但结果可能不符合预期(比如true << 1结果为2,赋值回bool仍为true)。
3. a &= b和a |= b是否等价于a = a && b/a = a || b?
a &= b:最终布尔结果和a && b一致,但不具备短路特性——b会被强制计算,而a && b在a为false时不会计算b。本质上它等价于a = static_cast<bool>(static_cast<int>(a) & static_cast<int>(b))。a |= b:同理,最终布尔结果和a || b一致,但b始终会被计算,不具备||的短路求值特性。
4. bool类型的原地异或写法
a ^= b是合法的原地赋值运算符,完全等价于a = a ^ b。其逻辑为:当a和b布尔值相同时结果为false,不同时结果为true,本质是将a、b提升为int执行异或后,再转换回bool类型。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

