数学方程等效于按位运算

时间:2017-02-22 20:26:32

标签: c++ bit-manipulation

我正在阅读的一段c ++代码

int x = 10;
int r = 5;

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

其中bb读取20.我理解按位操作是如何工作的,但是我很难解释它的数学逻辑,比如说,使用传统的数学方程式来解释。例如,&lt;&lt;意味着转变。所以x&lt;&lt; n可能是x ^ n?那么&amp;这意味着什么?

4 个答案:

答案 0 :(得分:3)

此等式执行以下操作:

(r&amp; 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是奇数,这个术语会加倍(左移),解释结果

答案 1 :(得分:2)

r & 0x1r1之间的按位AND。这基本上等同于检查r是偶数还是奇数。

如果1为偶数,则r如果r为奇数或不执行任何操作(位移为0),则语句会预先形成n位移位。左移一个整数2^n相当于将其乘以x。因此,在这种情况下,如果r为奇数,它会使{{1}}加倍。

答案 2 :(得分:2)

&安培;是按位和运算符

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

左移n对应乘以2 ^ n。

当r = 5为奇数时,左移1为执行,导致10 *(2 ^ 1)= 20

答案 3 :(得分:2)

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

可以翻译成英文:

如果r为奇数,请将bb初始化为x * 2 如果r为偶数,请将bb初始化为x

如果r & 0x1为奇数,则{p> 1r;如果0为偶数,则rx << 1

x * 2等于x << 0 x等于EXCEPTION: Expression has changed after it was checked. Previous value: 'Advertising'. Current value: 'Contractors'.