简单的问题,但我似乎无法弄清楚:
如果我有一个整数,比如12,我对它执行以下位操作:
int i = 12;
i = (i << 3) + (i << 1);
我以120(12 * 10)结束。这是任何数字的情况。
有人可以简洁地向我解释为什么这有效吗? (当涉及到位移时,我显然错过了一些非常简陋的东西)。
由于
答案 0 :(得分:20)
表达为乘法。
i = (i << 3) + (i << 1);
i = (i * 8) + (i * 2);
i = 8i + 2i
i = 10i
答案 1 :(得分:5)
你基本上是这样做的:
i = i*2^3 + i*2
答案 2 :(得分:3)
答案 3 :(得分:1)
向左移动3个位置等于乘以8,移动1个位置等于乘以2所以你正在做
i = i * 8 + i * 2
答案 4 :(得分:1)
左位移与乘以2的幂相同(通常)相同。即<< 1
相当于*(2^1)
,<< 2
相当于*(2^2)
,依此类推......
如果您将其替换为您的示例,您可以看到为什么您的结果乘以10:
int i = 12;
i = (i * 2^3) + (i * 2^1);
= { i = (i * 8) + (i * 2);}
= { i = 8i + 2i; }
= { i = 10i; }
答案 5 :(得分:0)
将bitshifts重写为乘以2的幂,所有都应该变得清晰。