Побитовые операции. Преобразование старшего байта, чтобы его двоичное представление стало палиндромом (C++)
Дано короткое целое неотрицательное число. Преобразовать старший байт числа таким образом, чтобы его двоичное представление стало палиндромом. Число представлено в виде 16-ричной сс. (ввод и вывод)
#include <iostream>
#include <stdio.h>
#include <locale.h>
typedef unsigned short ushort;
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
ushort num, upp = 0;
cout << "Введите число в 16-ичной системе: ";
cin >> hex >> num;
cin.get();
ushort low = num & 15;
for (int i = 0; i < 16; i++)
{
if (low & (1 << 16 - i))
{
upp += (1 << (16 - i));
}
}
ushort res = low + 16 * upp;
cout << "Число преобразовано в: " << hex << res << endl;
return 0;
}
При вводе числа "00FF", программа выдаёт результат "EF" - что неправильно. Проблема во всём цикле, не очень понимаю, что не так.
Ответы (2 шт):
Автор решения: MBo
→ Ссылка
ushort low = num & 0xFF;
for (int i = 0; i < 8; i++)
{
upp = upp << 1;
upp |= (low >> i) & 1;
}
ushort res = low + 0x100 * upp;
Автор решения: Harry
→ Ссылка
Еще один вариант, без цикла
ushort pal(ushort x)
{
ushort y = x & 0xFF;
x = (x&0x55)<<1|(x&0xAA)>>1;
x = (x&0x33)<<2|(x&0xCC)>>2;
x = (x&0x0F)<<4|(x&0xF0)>>4;
return y|(x<<8);
}