6

文字として読み込まれるバイナリファイルがあります。各文字は、他の誰かによって(ラップを想定して)不明な回数だけ左にビットシフトされました。各文字を読み取ってから、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ビットをいじるだけでよいと思いました。

どんな助けでもいただければ幸いです。

編集:解決しました。みなさん、どうもありがとうございました。このコミュニティを死ぬほど愛してください、皆さんは素晴らしいです!

4

3 に答える 3

15

charのsignessに注意してください。多くのシステムで署名されています。だからあなたletter >>= 1はシフトを埋めるサインです。

整数の回転は通常、次のように行われます。

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

マークがコメントで指摘しているように、OR|またはXORのいずれかを使用できます^

于 2013-03-26T21:57:11.197 に答える
0

ステートメントtemp <<= 7は、ラップしたいビットを失っています。一度に1ビットずつ左シフトをループする必要があります。最初に最上位のcharビットをチェックし、設定されている場合は、シフトを実行する前にそれを右端のビットに移動します。

于 2013-03-26T22:02:20.667 に答える
0

私はより大きな積分型を使用する傾向があります:

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

valこれで、上位ビットをラップバックする追加のコードなしで、値をシフトする必要があります。

于 2013-03-26T22:13:27.807 に答える