用包裹移位一个字符? C ++

时间:2013-03-26 21:54:36

标签: c++ bit-manipulation bit bit-shift

我有一个二进制文件,将以字符形式读入。其他人将每个角色移位到左侧未知次数(假设有包裹)。我希望能够读入每个角色,然后将换档换到右侧(换档的次数我想必须手动计算,因为我还没想出另一种方法)。

所以,我现在的想法是我读了一个字符,用temp创建一个副本然后使用XOR:

char letter;    //will hold the read in letter
char temp;      //will hold a copy of the letter
while(file.read(&letter, sizeof(letter)) //letter now holds 00001101
{
    temp = letter;  //temp now holds 00001101
    letter >>= 1;   //shift 1 position to the right, letter now holds 00000110
    temp <<= 7;     //shift to the left by (8-1), which is 7, temp now holds 10000000
    letter ^= temp; //use XOR to get the wrap, letter now holds 10000110
    cout << letter;
}

这在我筋疲力尽的头脑中是有道理的,但它不起作用......我无法弄清楚为什么。 char的大小是1个字节,所以我想我只需要乱用8位。

任何帮助都将不胜感激。

编辑:解决了。非常感谢大家。喜欢这个社区致死,你们真棒!

3 个答案:

答案 0 :(得分:11)

注意char的signess。在许多系统上都签了名。因此,letter >>= 1标志着这一转变。

旋转整数通常按如下方式完成

letter = ((unsigned char)letter >> 1) | (letter << 7);

正如Mark在评论中指出的那样,您可以使用OR |或XOR ^

答案 1 :(得分:0)

语句temp <<= 7正在丢失您要包装的位。  您需要一次循环向左移位一位。首先检查最重要的char位,如果设置将它移动到最右位,然后再进行移位。

答案 2 :(得分:0)

我倾向于使用更大的整数类型:

unsigned val = (unsigned)letter & 0xFF;
val |= val << 8;

现在你只需要在val中移位值,而无需任何额外的代码来重新包装高位。