等效于按位运算的数学公式
Math equation equivalent to bitwise operation
我正在阅读的一段 c++ 代码是
int x = 10;
int r = 5;
auto bb = x << (r & 0x1);
其中 bb 读 20。我了解按位运算的工作原理,但我很难解释它的数学逻辑,比如说,使用传统的数学方程来解释上面。例如,<<表示移位。那么 x <<n 可能是 x^n?那么这里意味着什么呢?
此等式执行以下操作:
(R&0x1)检查R的奇数,例如:
r = 5 -> 00000101 in bits
0x1 -> 00000001 in bits
r & 0x1->00000001 since its only 1 if both bits are one.
因此,如果 r 是奇数,则此项的结果为 1,如果 r 为偶数,则
为0。现在我们用这个值(1 或 0)向左移动。
n << 0/1
n = 10: 00001010
n << 1 00010100
因此,如果 R 为奇数,则此项将加倍(向左移动),从而解释结果
r & 0x1
是r
和1
之间的按位 AND 。这基本上等同于检查r
是偶数还是奇数。
如果r
是奇数,则该语句预示1
位移位,如果r
偶数,则不执行任何操作(位移为 0)。将整数左移n
相当于将其乘以2^n
。因此,在这种情况下,如果r
是奇数,它将x
加倍。
& 是按位和运算符
如果设置了最后一个位(即如果 r 是奇数),则r & 0x1
结果为 1,如果未设置最后一位(r 是偶数),则结果为 0。
左移 n 对应于乘以 2^n。
当 r = 5 是奇数时,左移 1 被执行,导致 10 * (2^1) = 20
auto bb = x << (r & 0x1);
可以翻译成英文为:
如果r
奇数,请将bb
初始化为x * 2
。
如果r
为偶数,则将bb
初始化为x
。
如果r
是奇数,则r & 0x1
1
,如果r
是偶数,则0
。
x << 1
等于x * 2
。x << 0
等于x
。
相关文章:
- 如果没有数学库,我如何在C++中创建复利公式
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?
- 两个字符串之间的数学运算
- Arduino 上数学运算的计时速度 - 异常
- 为什么在C++不可能递增或进行数学运算,例如在声明为数组的变量上乘法
- 如何使用C++中的数组进行矩阵数学运算
- C++ Switch 语句中的数学运算
- 我的控制台正在打印随机单词以及没有执行正确的数学运算
- 浮点数学运算后舍入不一致
- 等效于按位运算的数学公式
- 数学 - 公式v [i] =([V [i-1] * v [i-1] /(i 2)] v [i-1] * i
- 如何在 c++ 中从字符串中解析数学公式
- 实现数学公式时出现溢出问题
- 验证数学公式 C++
- C++嵌入数学公式
- 从外部输入文件将字符串数学公式以double形式读入cpp
- 实际的数学公式涉及C++代码