Похоже, вы уже приняли ответ, но я дам вам немного больше отзывов, чтобы надеяться помочь вам на вашем пути.У вас есть пара проблем:
Во-первых, ваш пример ключа 11110000 сбивает с толку.Это двоичный или шестнадцатеричный?Двоичный 0b11110000 - это 8-битное число, а не 32-битное число.Принимая во внимание, что шестнадцатеричное 0x11110000 - это 32-разрядное число, но оно, вероятно, не будет сдвигаться по битам, как вы могли ожидать.Например, 0x11110000, сдвинутый влево на 1 бит, становится 0x22220000, а не 0x11100001.
Во-вторых, я вижу, что вы пытаетесь сделать, сохранив MSb и попытавшись поразрядно-ИЛИ позднее, как LSb.Но ваша смена неверна.Вы хотите поразрядно-ИЛИ значение в бит 0, а не в бит 1. Таким образом, ваша величина сдвига будет << 0, а не << 1. Поскольку << 0, по сути, не используется, вы можете просто ее отключить. </p>
Вот некоторые незначительные изменения в вашем коде, которые должны исправить ситуацию.Я добавил комментарии, чтобы описать, что я изменил.
for (int i = 0; i < 5; i++)
{
//uint32_t a = (1 << 31) & key;
// This shifts key 31 bits to the right, with the result being
// bit31 becomes bit0. Since you are using an unsigned int,
// all the upper bits will be 0.
uint32_t bit0 = key >> 31;
key = (key << 1);
// This step is unnecessary and also incorrect. I believe you
// are trying to zero out bit0. The bitwise shift left (above) will have
// shifted in a zero already.
//key &= ~(1 << 1);
// Now bitwise-OR in bit0.
//key |= (a << 1);
key |= bit0;
}