如何用C中的最高有效位(MSB)替换最低有效位(LSB)

时间:2019-03-13 19:02:31

标签: c bit-shift

我刚刚开始进行c编程,但是我遇到了一个问题,就是用最高有效位(MSB)替换最低有效位(LSB)。

例如,第一个密钥(密钥为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 个答案:

答案 0 :(得分:1)

假设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

}

答案 1 :(得分:1)

看起来您已经接受了答案,但是我会给您更多反馈,希望对您有所帮助。您遇到了几个问题:

首先,您的示例密钥11110000令人困惑。是二进制还是十六进制?二进制0b11110000是8位数字,而不是32位数字。十六进制的0x11110000是一个32位数字,但是它可能不会像您期望的那样按位移位。例如,左移1位的0x11110000变为0x22220000,而不是0x11100001。

第二,我看到了您要通过保存MSb并尝试在以后将其与LSb进行按位或的方法来进行操作。但是您的班次数量是错误的。您想对值按位进行“或”运算,而不是将其转换为位1,因此,移位量应为<< 0,而不是<<1。由于<< <<本质上是空操作,您可以将其保留。

以下是您的代码中的一些小更改,这些更改应该可以解决问题。我添加了评论以希望描述我所做的更改。

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;
}