我正在阅读的一段c ++代码
int x = 10;
int r = 5;
auto bb = x << (r & 0x1);
其中bb读取20.我理解按位操作是如何工作的,但是我很难解释它的数学逻辑,比如说,使用传统的数学方程式来解释。例如,&lt;&lt;意味着转变。所以x&lt;&lt; n可能是x ^ n?那么&amp;这意味着什么?
答案 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 & 0x1
是r
和1
之间的按位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> 1
为r
;如果0
为偶数,则r
为x << 1
。
x * 2
等于x << 0
x
等于EXCEPTION: Expression has changed after it was checked. Previous value: 'Advertising'. Current value: 'Contractors'.
。