2013-03-26 50 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; 
} 

這是有道理的,我疲憊的頭,但它不工作..我無法弄清楚爲什麼。字符的大小是1個字節,所以我認爲我只需要篡改8位。

任何幫助,將不勝感激。

編輯:解決。非常感謝大家。愛這個社區去死吧,你們真棒!

+0

你」已經告訴我們你的期望 - 你實際上得到了什麼? – 2013-03-26 21:57:06

+0

@sftrabbit一些神祕混亂的外表。 – 2013-03-26 21:57:57

+0

你正在閱讀到'letter'每個循環兩次,棄去先讀取值 – jthill 2013-03-26 21:59:55

回答

10

講究一個字符的signess。在許多系統上它都被簽名。所以你的letter >>= 1是填補這個轉變的標誌。如下

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

正如馬克在評論中指出

旋轉整數通常是這樣做,你可以使用OR |或XOR ^

+1

BOOM!這工作我的朋友!非常感謝。我沒有使用編輯的代碼,但我會嘗試。我所做的事情是通過一個字符串讀入一個無符號字符,它的功能就像一個魅力。非常感謝你指出未簽名的東西...不能相信我錯過了它。 – 2013-03-26 22:02:13

+0

如果沒有重疊位,'或'和'xor'會產生相同的結果。 – 2013-03-26 22:03:17

+0

@MarkRansom你是對的。這甚至沒有跨過我的腦海。 – Kyurem 2013-03-26 22:04:37

0

聲明temp <<= 7正在失去你想換行位。 您需要一次循環左移一位。首先檢查最重要的char位,如果在轉移之前將它移動到最右邊的位。

+0

由於字母向右移一次,所以temp向左移7。當我在它們兩個上使用XOR時,它會給我那個掉在右邊的位(現在它在左邊,纏繞)。 – 2013-03-30 10:11:50

0

我傾向於使用較大的整數類型:

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

現在你只需要在val移值,而無需任何額外的代碼來包裝高位回