等效于按位运算的数学公式

Math equation equivalent to bitwise operation

本文关键字:数学公式 运算 于按位      更新时间:2023-10-16

我正在阅读的一段 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 & 0x1r1之间的按位 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 & 0x11,如果r是偶数,则0

x << 1等于x * 2
x << 0等于x