如何在 C++ 中右移位?

How to right shift bits in c++?

我有一个十六进制数 0x8F(二进制为 10001111)。我想右移该值,因此新值将是 0xC7 (11000111)。我试过:

unsigned char x = 0x8F;
x=x>>1; 

但我得到的不是 0xC7,而是 0x47?关于如何做到这一点有什么想法吗?

右移一个无符号数将使新的进入,而不是一个。

注意右移不是右旋转。为此,您需要

x = (x >> 1) | (x << 7)

那是因为你想要的是"rotate right",而不是"shift right"。所以你需要调整最低位 "falling off":

 x = ((x & 1) << CHAR_BITS-1) | (x >> 1);

应该可以解决问题。

[至少一些编译器会检测到这组特定的操作并转换为相应的rorrol指令]

右移或左移将在字节的左侧或右侧分别填充0。移动后,您需要 OR 使用正确的值才能获得您期望的结果。

x = (x >> 1); /* this is now 01000111 */
x = x | ( 0x80 ); /* now we get what we want */

我在这里 OR 处理字节 10000000,即 0x80,结果是 0xC7

使它更简洁,变成:

x = (x >> 1) | (unsigned char)0x80;