битовая манипуляция — битовое смещение символа с переносом? Переполнение стека

У меня есть двоичный файл, который будет читаться как символы. Каждый персонаж был немного сдвинут влево неизвестное количество раз (при условии переноса) кем-то другим. Я хочу иметь возможность читать по каждому символу, а затем переносить сдвиг вправо (думаю, сколько раз сдвиг придется вычислять вручную, потому что я не нашел другого пути).

Итак, моя текущая идея заключается в том, что я читаю символ, создаю копию с помощью 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;
}

Это имеет смысл в моей измученной голове, но это не работает … и я не могу понять, почему. Размер символа составляет 1 байт, поэтому я решил, что мне нужно возиться только с 8 битами.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Решено. Большое спасибо всем. Любите это сообщество до смерти, вы, ребята, потрясающие!

6

Решение

Обратите внимание на подпись чарса. На многих системах это подписано. Так что ваши letter >>= 1 это знак, заполняющий смену.

Вращение целых чисел обычно выполняется следующим образом

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

Как отмечает Марк в комментариях, вы можете использовать либо ИЛИ | или XOR ^,

11

Другие решения

Заявление temp <<= 7 теряет биты, которые вы хотите обернуть.
Вам нужно будет циклически сдвигать влево один бит за раз. Сначала проверьте самый значащий бит символа и, если он установлен, передвиньте его вправо, прежде чем выполнять сдвиг.

0

Я был бы склонен использовать больший целочисленный тип:

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

Теперь вам просто нужно сместить значения в valбез какого-либо дополнительного кода, чтобы обернуть старшие биты обратно.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector