Да нет, уважаемый коллега, это не хня. Я неоднократно реализовывал подобную операцию, и никакой оптимизатор мне не мешал. Просто перед сдвигом надо анализировать старший или младший бит (соответственно) сдвигаемой переменной, установить флажок в соответствующее состояние (предварительно сохранив в другом флажке его старую величину), а после сдвига сохранённый флажок записать в соответсвующий бит сдвинутой величины.