2017-02-22 112 views
-1

一块的C++代码,我正在读的数学公式等同于位运算

int x = 10; 
int r = 5; 

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

其中BB读取20.我了解操作如何按位的作品,但我很难解释它的数学逻辑,比方说,使用上面解释了传统的数学方程。例如,< <意味着转移。所以x < < n可能是x^n?那么&是什么意思?

+0

&被称为“按位和”。详细计算:'x = 0b1010; r = 0b0101'。现在'r&0x1 = 0b0101&0b0001 = 1',然后'x << 1 = 0b1010 << 1 = 0b10100 = 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 0 * 1 = 20'。请参阅http://www.learncpp.com/cpp-tutorial/38-bitwise-operators/ – kritzikratzi

+0

ps。 'x << n'不是'x^n'。 (注意:在编程时,^ ^通常是一个xor,而不是数学能力)。无论如何,你可以使用shift来形成两个正的幂,一般来说:'1 << x = pow(2,x)'。几个例子:'1 << 0 = pow(2,0)= 1;''1 << 1 = pow(2,1)= 2;''1 << 2 = pow(2,2)= 4 ' – kritzikratzi

回答

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 & 0x1r1之间的按位与。这基本上等同于检查r是偶数还是奇数。

如果r是偶数,则r为奇数或不执行任何操作(位移为0)时,语句执行位移1。左移整数n等于将其乘以2^n。所以在这种情况下,如果r很奇怪,它会使x加倍。

2

&是按位和运营商

r & 0x1结果在1,如果该最后位被置位(即,如果r是奇数),并在0如果最后位未被置位(r为偶数)。

左移n对应于乘以2^n。

为R = 5是奇数1左移位perfomed,导致10 *(2^1)= 20

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

可以翻译成英文为:

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

r & 0x11如果r是奇数和0如果r是偶数。

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

+0

非常简单的答案!随着jonas_toth的深入解释,我现在了解按位操作! – Kyle

+0

@凯尔,很高兴我能够帮助你更好地理解按位操作。 –