相当于按位运算的数学方程

问题描述 投票:0回答:5

我正在阅读的一段 C++ 代码是

int x = 10;
int r = 5;

auto bb = x << (r & 0x1);

其中bb读为20。我理解按位运算是如何工作的,但我很难解释它的数学逻辑,比如用传统的数学方程来解释上面。例如,<< means shift. So x << n could be x^n? Then what does & mean here?

c++ bit-manipulation
5个回答
3
投票

该方程执行以下操作:

(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 是奇数,则此项会加倍(左移),解释结果


2
投票

r & 0x1
r
1
之间的按位与。这本质上相当于检查
r
是偶数还是奇数。

如果

1
为奇数,则该语句执行
r
的位移;如果
r
为偶数,则不执行任何操作(位移 0)。将整数左移
n
相当于将其乘以
2^n
。因此,在这种情况下,如果
x
是奇数,则将
r
加倍。


2
投票

& 是按位与运算符

如果设置了最后一位(即,如果 r 为奇数),则

r & 0x1
结果为 1;如果未设置最后一位(r 为偶数),则结果为 0。

左移 n 相当于乘以 2^n。

由于 r = 5 是奇数,因此左移 1,结果是 10 * (2^1) = 20


2
投票
auto bb = x << (r & 0x1);

可以翻译成英文为:

如果

r
为奇数,则将
bb
初始化为
x * 2

如果
r
为偶数,则将
bb
初始化为
x

如果

r & 0x1

 为奇数,则 
1
r
;如果
0
为偶数,则
r

x << 1
等于
x * 2

x << 0
等于
x


0
投票

让我们举个例子:必须向 PWM 应用一个值... PWM 为 UINT8,但必须限制为 7 位(0 到 127) Delta 是一个 16 位常数(0 到 65536) 钳位范围为 0 到 127。然后将该值传递给 PWM。 但这一切都没有改变 Delta 的价值。

这有效...

if((DELTA/8) > 127) { PWM = 127; }
else                { PWM = (uint8)(DELTA/8); }

这只是三元和位操作(SHIFT + BITWISE)

   PWM = ((DELTA>>3) & 0xFF80)? 0x7F : 0x7F & (DELTA>>3) ;

Note: DELTA remains Inchanged after, as wanted..
      also 0xFF80 or 0x1F80 does the same result.
© www.soinside.com 2019 - 2024. All rights reserved.