17

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

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

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

我最终得到 120 (12*10)。这是任何数字的情况。

有人可以简明扼要地向我解释一下,为什么这是有效的?(在位移方面,我显然遗漏了一些非常基本的东西)。

4

6 回答 6

27

Express as multiplication.

i = (i << 3) + (i << 1);
i = (i * 8) + (i * 2);
i = 8i + 2i
i = 10i
于 2012-05-25T16:19:41.870 回答
6

You are basically doing:

i = i*2^3 + i*2
于 2012-05-25T16:19:29.943 回答
4

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

分发属性告诉我们:

x = i * 10
x = i * (8 + 2)
x = 8i + 2i
于 2012-05-25T16:21:24.117 回答
1

向左移动 3 位等于乘以 8,移动 1 位等于乘以 2,所以你正在做

i = i * 8 + i * 2
于 2012-05-25T16:20:26.190 回答
1

左位移(通常)与乘以 2 的幂相同。ie<< 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; }
于 2012-05-25T16:24:06.050 回答
0

Rewrite the bitshifts as multiplications by powers-of-2, and all should become clear.

于 2012-05-25T16:19:57.723 回答