Простой вопрос, но я не могу понять его:
Если у меня есть целое число, скажем, 12, и я выполняю над ним следующие битовые манипуляции:
int i = 12;
i = (i << 3) + (i << 1);
В итоге получается 120 (12*10). Это касается любого числа.
Может кто-нибудь кратко объяснить мне, почему это работает? (Я, очевидно, упускаю что-то довольно элементарное, когда дело доходит до битового сдвига).
Спасибо
Ответ 3 · рейтинг 4 · SirPentor
i << 3 эквивалентно i * 8. i << 1 эквивалентно i * 2.
свойство distribute сообщает нам следующее:
x = i * 10
x = i * (8 + 2)
x = 8i + 2i
Ответ 5 · рейтинг 1 · NominSim
Левый битовый сдвиг (обычно) такой же, как умножение на степень двойки. то есть << 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; }