如何在 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);
应该可以解决问题。
[至少一些编译器会检测到这组特定的操作并转换为相应的ror
或rol
指令]
右移或左移将在字节的左侧或右侧分别填充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;
我有一个十六进制数 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);
应该可以解决问题。
[至少一些编译器会检测到这组特定的操作并转换为相应的ror
或rol
指令]
右移或左移将在字节的左侧或右侧分别填充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;