如何用 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;
}
我刚开始进行 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;
}