[英]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.