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