-1

Есть код, который шифрует числа, путём перестановки первого и последнего бита в байте. Как сделать обратное действие?

unsigned int n = abs(atoi(arr[i]));
                //Замена бита
                if (n && ((n & 1) == 0))
                {
                    unsigned int i = -1;
                    for (unsigned int m = n; m; m >>= 1, i++);
                    n = (n & ~(1 << i)) | 1;
                }

Kromster
  • 13,809
  • Отнюдь. Вы взяли код отсюда - https://ru.stackoverflow.com/a/1288689/195342 - но там ведь речь шла - и вы это оговаривали, когда вас спрашивали!!! - не о первом и последнем бите в байте! В этом варианте однозначная обратная операция невозможна - и 14, и 7 превратятся при ней в 7. Во что теперь превращать 7 назад? Еще раз посмотрите тот вопрос и оцените мучения в ответах :) - в то время как обмен первого и последнего битов байта делается в полстроки... – Harry Jun 04 '21 at 14:55
  • @Harry, Да, видимо догадки про 14 и 7 не правильные... Моя косяк... Так я сидел и пробовал эти несколько дней, всё что писали люди) Много написано сложновато, а мне осталась эта проклятая задача с битовыми операциями в курсовой... А будет хоть подсказка куда копать что-то решить её? – Vlad Ryazantsev Jun 04 '21 at 15:54
  • https://ru.stackoverflow.com/q/454263/235436 – Кирилл Малышев Jun 04 '21 at 16:18
  • @КириллМалышев, си, не с++ – Vlad Ryazantsev Jun 04 '21 at 16:40

1 Answers1

1

Вот как поменять местами первый и последний биты байта:

unsigned char rv(unsigned char n)
{
    return (n<<7)|(n>>7)|(n&0x7E);
}

Только очень уж убогое шифрование получается :) - https://ideone.com/wTKWSg

Harry
  • 221,325