如何在c ++中右移位?

ose*_*mec 6 c++ bit-shift

我有一个十六进制数字0x8F(二进制10001111).我想改变那个值,所以新的值将是0xC7(11000111).我尝试过:

unsigned char x = 0x8F;
x=x>>1; 
Run Code Online (Sandbox Code Playgroud)

但不是0xC7我得到了0x47?关于如何做到这一点的任何想法?

650*_*502 14

无符号数量的右移将使新的进入,而不是.

请注意,右移不是正确的旋转.要做到这一点,你需要

x = (x >> 1) | (x << 7)
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 8

那是因为你想要的是"向右旋转",而不是"右移".所以你需要调整最低位"下降":

 x = ((x & 1) << CHAR_BITS-1) | (x >> 1);
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

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