我正在尝试在 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/