簡體   English   中英

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

[英]Bit shifting a character with wrap? C++

我有一個二進制文件,將作為字符讀入。 其他人將每個角色移位到左側未知次數(假設有包裹)。 我希望能夠讀入每個角色,然后將換檔換到右側(換檔的次數我想必須手動計算出來,因為我還沒想出另一種方法)。

所以,我目前的想法是我讀了一個字符,用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位。

任何幫助,將不勝感激。

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

注意char的signess。 在許多系統上都簽了名。 所以你的letter >>= 1是填補班次的標志。

旋轉整數通常如下進行

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

正如Mark在評論中指出的那樣,你可以使用OR | 或XOR ^

語句temp <<= 7正在丟失要包裝的位。 您需要一次循環向左移位一位。 首先檢查最重要的char位,如果設置將其移動到最右位,然后再進行移位。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM