簡単な質問ですが、私はそれを完全に理解できないようです:
整数、たとえば12がある場合、次のビット操作を実行します。
int i = 12;
i = (i << 3) + (i << 1);
最終的に120(12 * 10)になります。これは、任意の数の場合です。
誰かが私に簡潔に説明できますか、なぜこれが機能するのですか?(ビットシフトに関しては、明らかに非常に初歩的なものが欠けています)。
簡単な質問ですが、私はそれを完全に理解できないようです:
整数、たとえば12がある場合、次のビット操作を実行します。
int i = 12;
i = (i << 3) + (i << 1);
最終的に120(12 * 10)になります。これは、任意の数の場合です。
誰かが私に簡潔に説明できますか、なぜこれが機能するのですか?(ビットシフトに関しては、明らかに非常に初歩的なものが欠けています)。
乗算として表現します。
i = (i << 3) + (i << 1);
i = (i * 8) + (i * 2);
i = 8i + 2i
i = 10i
あなたは基本的にやっています:
i = i*2^3 + i*2
左に3桁シフトすることは、8を掛けることに等しいので、1桁シフトすることは、2を掛けることに等しいので、
i = i * 8 + i * 2
左ビットシフトは(通常)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; }
ビットシフトを2の累乗による乗算として書き直すと、すべてが明らかになるはずです。