Этот код ниже сдвигает вправо на 1 бит, как вы описали.
Он работает, маскируя все, кроме самого младшего бита в hi
, и сдвигая его полностью влево (самый значимый бит), и соединяя его с lo
, сдвинутым вправо на один бит.
Затем он просто сдвигает hi
на один бит вправо.
{
lo = ((hi & 0x00000001)<<31) | (lo >> 1);
hi = hi >> 1;
}