2013-03-26 10 views
5

私は文字として読み込まれるバイナリファイルを持っています。それぞれのキャラクターは、他の誰かによって左の不明な回数(ラップされていると仮定)にビットシフトされました。私はそれぞれのキャラクターを読んでから、右にシフトしたいと思っています(別の方法を考え出していないので、シフトする回数は手作業で考えなければならないでしょう)。文字を折り返しでビットシフトしますか? C++

だから、私の現在の考えは、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ビットで扱うだけだと思った。

ご協力いただければ幸いです。

EDIT:解決済み。みんなに感謝します。このコミュニティを愛しています、皆さんは素晴らしいです!

+0

あなたは」あなたが期待していることを教えてくれました。実際には何を得ていますか? –

+0

@sftrabbitいくつかの謎めいた混乱。 –

+0

ループごとに2回 'letter 'に読み込み、最初の読み込み値を破棄します。 – jthill

答えて

10

charの大文字小文字に注意してください。多くのシステムで署名されています。したがって、あなたのletter >>= 1はシフトを埋めるサインです。マークがコメントで指摘するように

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

を次のように

回転整数は通常行われている、あなたはどちらか、または|またはXOR ^を使用することができます。

+1

ブーム!それは私の友人を働いた!どうもありがとうございます。編集したコードは使用しませんでしたが、試してみます。私がしたことは、charのキャストでunsigned charに読み込まれ、魅力的に機能しました。署名のないことを指摘してくれてありがとう...私はそれを逃したと信じられない。 –

+0

重複ビットがない場合、 'または'と 'xor'は同じ結果を生成します。 –

+0

@ MarkRansomあなたは正しいです。それは私の心を横切っていませんでした。 – Kyurem

0

temp <<= 7は、折り返したいビットが失われています。 一度に1ビット左にシフトする必要があります。最初に最も重要な文字ビットをチェックし、シフトを行う前に右端のビットに移動するように設定した場合。私は、より大きな整数型を使用するために傾いているはずだ

+0

テンポは、文字が右に1度移動するため、左に7シフトします。私は両方のXORを使用すると、右側にドロップされたビットが表示されます(そして今は左側にあります)。 –

0

:今、あなたは戻ったばかりで、高ビットをラップするために、任意のコードを追加せずに、valに値をシフトする必要が

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

関連する問題