Bitshifting将整数乘以10

时间:2012-05-25 16:17:27

标签: c++ bit-manipulation

简单的问题,但我似乎无法弄清楚:

如果我有一个整数,比如12,我对它执行以下位操作:

int i = 12;
i = (i << 3) + (i << 1);

我以120(12 * 10)结束。这是任何数字的情况。

有人可以简洁地向我解释为什么这有效吗? (当涉及到位移时,我显然错过了一些非常简陋的东西)。

由于

6 个答案:

答案 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)

i << 3相当于i * 8i << 1相当于i * 2

distribute property告诉我们:

x = i * 10
x = i * (8 + 2)
x = 8i + 2i

答案 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的幂,所有都应该变得清晰。