c++ - C++ 中循环移位的问题

标签 c++ bit-manipulation

我正在尝试在 C++ 中实现循环位移。它有点工作,除了在某个点之后我得到一堆零。

for (int n=0;n<12;n++) {
    unsigned char x=0x0f;
    x=((x<<n)|(x>>(8-n))); //chars are 8 bits
    cout<<hex<<"0x"<<(int)x<<endl;
}

我的输出是:

0xf
0x1e
0x3c
0x78
0xf0
0xe1
0xc3
0x87
0xf
0x0
0x0
0x0

如您所见,我开始获得 0x0,而不是预期的 0x1e、0x3c 等。

如果我将 for 循环扩展到迭代 60 次左右,数字会正确返回(在一堆零之后。)

我假设一个字符有很大的空间,未使用数据的“间隙”为零。我的理解有点有限,所以任何建议将不胜感激。有办法去掉那些零吗?

最佳答案

移动负数是未定义的行为。

您从 0 循环到 12,但您的类次中有一个 8 - n。所以这将变为负值。

如果你想处理 n > 8,你需要取模 8。(假设你想要 8 位循环移位。)


for (int n=0; n < 12; n++) {
    unsigned char x = 0x0f;
    int shift = n % 8;   //  Wrap modulus
    x = ((x << shift) | (x >> (8 - shift))); //chars are 8 bits
    cout << hex << "0x" << (int)x << endl;
}

关于c++ - C++ 中循环移位的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888298/

相关文章:

c++ - 套接字 - IPPPROTO_TCP 与。 0

c++ - 如何处理 windows.h 中的 max 宏与 std 中的 max 冲突?

当大小固定但不是 constexpr 时,C++ 替代 std::array?

c++ - Dev C++ 在指针地址的情况下给出不同的结果

c - 相反符号按位相加

bit-manipulation - 使用 1 的补码生成显示第一个非零位的掩码

c++ - C 到 C++

C++ 按位或运算符

colors - 理解 Go 标准库中的一些魔法

mysql - 设置 Int16 溢出时的累加值