Как заменить младший значащий бит (LSB) на младший значащий бит (MSB) в C - PullRequest
0 голосов
/ 13 марта 2019

Я только что начал c-программирование, и у меня возникла проблема с заменой младшего значащего бита (LSB) на старший значащий бит (MSB).

Например, первый ключ (32-битный ключ) - 11110000, а после преобразования - 11100001, затем 11000011, а затем 10000111, 00001111, 00011110 и т. Д.

Вот мой код, который я пробовал:

for (int i = 0; i < 5; i++)
{
    uint32_t a = (1 << 31) & key;

    key = (key << 1);
    key &= ~(1 << 1);
    key |= (a << 1);
}

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Похоже, вы уже приняли ответ, но я дам вам немного больше отзывов, чтобы надеяться помочь вам на вашем пути.У вас есть пара проблем:

Во-первых, ваш пример ключа 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;
}
1 голос
/ 13 марта 2019

Предполагая, что key также имеет тип uint32_t, вы можете попробовать это

  for (int i = 0; i < 5; i++)
{
   uint32_t a = key >> 31;  //convert MSB to LSB
   key <<= 1; // shift key 1 bit to the left, (discarding current MSB) making space for new LSB
   key |= a;  // append LSB

}
...