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

问题描述 投票:0回答:2

我刚刚开始进行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);
}
c bit-shift
2个回答
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
投票

看起来你已经接受了答案,但我会给你一些反馈,希望能帮到你。你有几个问题:

首先,您的示例键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;
}
© www.soinside.com 2019 - 2024. All rights reserved.