我正在阅读的一段 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?
该方程执行以下操作:
(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
之间的按位与。这本质上相当于检查 r
是偶数还是奇数。
如果
1
为奇数,则该语句执行 r
的位移;如果 r
为偶数,则不执行任何操作(位移 0)。将整数左移 n
相当于将其乘以 2^n
。因此,在这种情况下,如果 x
是奇数,则将 r
加倍。
& 是按位与运算符
如果设置了最后一位(即,如果 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 & 0x1
为奇数,则
1
为 r
;如果 0
为偶数,则 r
。
x << 1
等于 x * 2
。x << 0
等于 x
。
让我们举个例子:必须向 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.