按位运算求值
Evaluation with bitwise operation
本文关键字:运算 更新时间:2023-10-16
检查n是否是2的指数时,我写了下面一行:
if(n&(n-1)!=0)
令我惊讶的是,当n = 6时,它的值为false。如果我把它改成
if((n&(n-1))!=0)
我得到正确的结果。
编辑:我知道!=
首先被评估,但我仍然看不出在n = 6的情况下结果是假的。5!=0为真那么6&true仍然是true,对吗?
在您原来使用的表达式中,首先执行(n-1) != 0
,然后对其结果应用n &
。
乍一看可能不符合逻辑,但==
和!=
具有比&
或|
更高的优先级。
这是一个常见的C/c++行为,它已经被它的批评解决了:
C和c++中的运算符:对位运算符和等号运算符优先级
的批评从概念上讲,操作符|
和&
类似于+
和*
,因此将它们放在低优先级不是很直观,并且会导致像您发布的问题。
提示:在接触任何编程语言时,最好养成在有疑问时检查运算符优先级主题的习惯。实际上,你很快就会发现,在此期间,你实际上记住了它。
我想说优先顺序在这里是非常重要的。从第二次尝试,结果是正确的,因为这被称为操作符优先级(或"操作顺序")。通用操作符的优先级通常定义为首先执行"高级"操作(即高级操作"绑定更紧密")/对于简单表达式,操作通常按以下顺序从高到低排序:
- Parenthesization
- !
- 求幂
- 加减法
(
导致整个平衡的改变。相同的概念,但是按位操作的优先级最低。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- GCC本机矩阵运算库
- 位阵列上的快速AND运算
- 字符串中int的加法运算
- 算术运算的结果类似于:C浮点变量中的1/3
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 如何在 vtk Poly 数据上进行布尔运算?
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 避免指针运算,修复叮当整齐错误
- 使用双精度的浮点运算
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 更快的C++算术运算
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 两个字符串之间的数学运算
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 何时使用按位运算而不是算术替代方法?
- Arduino 上数学运算的计时速度 - 异常
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度