Нет необходимости использовать long
в качестве посредника. Если вы сдвигаетесь влево, начните с самого высокого порядка int, сдвигая вправо, начиная с самого низкого. Добавьте перенос из соседнего элемента, прежде чем изменять его.
void ShiftLeftByOne(int * arr, int len)
{
int i;
for (i = 0; i < len - 1; ++i)
{
arr[i] = (arr[i] << 1) | ((arr[i+1] >> 31) & 1);
}
arr[len-1] = arr[len-1] << 1;
}
Эта техника может быть расширена, чтобы сделать сдвиг более чем на 1 бит. Если вы используете более 32 бит, вы берете 32-битный счетчик мод и сдвигаетесь на него, перемещая результат дальше в массиве. Например, чтобы сместить влево на 33 бита, код будет выглядеть примерно так:
void ShiftLeftBy33(int * arr, int len)
{
int i;
for (i = 0; i < len - 2; ++i)
{
arr[i] = (arr[i+1] << 1) | ((arr[i+2] >> 31) & 1);
}
arr[len-2] = arr[len-1] << 1;
arr[len-1] = 0;
}