умножение битового сдвига в c, не используя полномочия 2

Как я могу выполнить умножение на 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);