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

How to replace the the least significant bit (LSB) with most significant bit (MSB) in C

我刚开始进行 C 编程,但在用最高有效位 (MSB) 替换最低有效位 (LSB) 时遇到了问题。

比如第一个key(key是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);
}

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

}

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

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

其次,我明白了您要通过保存 MSb 并稍后尝试按位或将其作为 LSb 来执行的操作。但是你的班次金额是错误的。你想按位或将值放入位 0,而不是位 1。所以你的移位量将是 << 0,而不是 << 1。因为 << 0 本质上是一个空操作,你可以把它关掉。

这里对您的代码进行了一些小改动,应该可以解决问题。我添加了评论,希望能描述我所做的更改。

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