我刚刚开始进行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);
}
假设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;
}