C++中循环位移的问题

der*_*erp 3 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;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:

0xf
0x1e
0x3c
0x78
0xf0
0xe1
0xc3
0x87
0xf
0x0
0x0
0x0
Run Code Online (Sandbox Code Playgroud)

如你所见,我开始得到0x0而不是预期的0x1e,0x3c等.

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

我假设一个char占据了一个很大的空间,未使用数据的"空白"是零.我的理解有点受限,所以任何建议都将受到赞赏.有没有办法抛出那些零?

Mys*_*ial 9

以负数换算是未定义的行为.

你循环012,但你有一个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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你应该包括一个修复(例如`8 - (n%8)`或类似). (2认同)