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占据了一个很大的空间,未使用数据的"空白"是零.我的理解有点受限,所以任何建议都将受到赞赏.有没有办法抛出那些零?
以负数换算是未定义的行为.
你循环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;
}
Run Code Online (Sandbox Code Playgroud)