Как я могу выполнить умножение на 36, используя бит-сдвиг? Разве можно не только умножить на степени 2? Например:
unsigned x = 4; // binary 00000000 00000000 00000000 00001000 unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 ... 00100000
Спасибо!
Вы не можете размножаться с помощью неэнергетического смещения по 2 бита.
Но вы можете разбить его с помощью добавления и умножения:
x * 36 = x * (32 + 4) = (x * 32) + (x * 4)
Поскольку 32
и 4
являются степенями 2
( 2^5
и 2^2
соответственно), вы можете выполнять их как отдельные сдвиги и добавлять результаты.
Вы не можете с помощью бит-сдвига в одиночку. Битовое смещение двоичного числа может только умножаться или делиться степенями 2, точно так же, как вы говорите. Аналогичным образом, вы можете умножать или делить десятичное число на 10 с помощью сдвига места (например, 3 могут стать 30, 300, 0,3 или 0,03, но никогда не 0,02 или 99).
Но вы можете сломать 36 до сумм сил двух.
То есть вы можете разделить 36 на 32 + 4, что составляет 2 ^ 5 + 2 ^ 2. По формулировке, которую вы использовали («писать код, который использует сдвиги»), единственное требование – использовать битовое смещение, и ему должно быть разрешено выполнять дополнительные операции, пока это требование выполняется.
То есть,
x * 36 = x * (32 + 4) = 32x + 4x = (2^5)x + (2^2)x = (x << 5) + (x << 2)
При таком понимании простейшей реализацией было бы добавить два сдвинутых значения:
int result = (x << 5) + (x << 2);