C+中的循环位移位问题+; 我试图在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; }

C+中的循环位移位问题+; 我试图在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; },c++,bit-manipulation,C++,Bit Manipulation,如您所见,我开始得到0x0,而不是预期的0x1e、0x3c等 如果我将for循环扩展到迭代60次左右,则数字会正确返回(在一系列零之后) 我假设一个字符包含一个很大的空间,未使用数据的“间隙”为零。我的理解有点有限,所以任何建议都将不胜感激。有没有办法去掉这些零?以负数移位是未定义的行为 你从0循环到12,但是你的班次中有一个8-n。所以这将变成负数 如果要处理n>8,则需要取8的模数。(假设需要8位循环移位。) for(int n=0;n(8-shift));//字符是8位 cout将一个字

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

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


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

以负数移位是未定义的行为

你从
0
循环到
12
,但是你的班次中有一个
8-n
。所以这将变成负数

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


for(int n=0;n<12;n++){
无符号字符x=0x0f;
int shift=n%8;//换行模数
x=((x>(8-shift));//字符是8位

cout将一个字节左移超过7将始终导致0。 此外,未定义负移位量

为了解决这个问题,您必须将移位限制为类型的大小

基本上:

unsigned char x = 0xf;
int shift = n&7;
x=((x<<shift)|(x>>(8-shift)))
无符号字符x=0xf;
int shift=n&7;
x=((x(8移位)))

以负数移动是未定义的行为。@神秘的,你应该把它放在一个答案中。当
n>8
时,你期望会发生什么?哈哈!8-n。所以过一段时间它会变成负数。你可能应该包括一个修复(例如
8-(n%8)
或类似的)。“将一个字节左移超过7将始终导致0。”-不完全如此。移位超过
int
中的位数将导致未定义的行为。好的,是的,好的,取一个低8位设置为0的整数(这将是移位的结果)
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;
}
unsigned char x = 0xf;
int shift = n&7;
x=((x<<shift)|(x>>(8-shift)))