Как вы указали, сдвиг влево - это то же самое, что и умножение на два.По крайней мере, это когда мы говорим о неподписанных количествах.Значение «сдвига влево» количества со знаком ... зависит от языка.
В современных компиляторах нет никакой разницы между написанием «i = x * 2;»и "i = x << 1;"Компилятор сгенерирует наиболее эффективный код.Так что в этом смысле нет причин предпочитать сдвиг умножению. </p>
Некоторые алгоритмы работают, сдвигая величину влево на один бит, а затем устанавливая младший бит равным 0 или 1. Некоторые простые алгоритмы сжатия работают таким образом.Например, если ваше накопленное значение находится в переменной x, а текущее значение (0 или 1) - в y, то имеет смысл написать «x = (x << 1) | y», а не «x= (x * 2) + y ".Оба делают одно и то же, но первое более правильное <em>обозначено .Вам не нужно думать: «О, да, умножение на два - это то же самое, что и сдвиг влево».
Кроме того, когда вы говорите об алгоритмах, которые сдвигают биты, удобнее сдвигать влевоили прямо на конкретное число битов, чтобы выяснить, какое кратное 2 вы хотите умножить или разделить на.
Итак, в то время как обычно нет никакого выигрыша в производительности смещения, а не умножения - по крайней мере, при работес языками высокого уровня - бывают случаи, когда способность сдвигать делает ваши дела более понятными.