简单的问题,但我似乎无法弄清楚:
如果我有一个整数,比如 12,我对它执行以下位操作:
int i = 12;
i = (i << 3) + (i << 1);
我最终得到 120 (12*10)。这是任何数字的情况。
有人可以简明扼要地向我解释一下,为什么这是有效的?(在位移方面,我显然遗漏了一些非常基本的东西)。
简单的问题,但我似乎无法弄清楚:
如果我有一个整数,比如 12,我对它执行以下位操作:
int i = 12;
i = (i << 3) + (i << 1);
我最终得到 120 (12*10)。这是任何数字的情况。
有人可以简明扼要地向我解释一下,为什么这是有效的?(在位移方面,我显然遗漏了一些非常基本的东西)。
Express as multiplication.
i = (i << 3) + (i << 1);
i = (i * 8) + (i * 2);
i = 8i + 2i
i = 10i
You are basically doing:
i = i*2^3 + i*2
向左移动 3 位等于乘以 8,移动 1 位等于乘以 2,所以你正在做
i = i * 8 + i * 2
左位移(通常)与乘以 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; }
Rewrite the bitshifts as multiplications by powers-of-2, and all should become clear.