Jochen Arndt
Это похоже. Просто используйте соответствующие маски (0x000F и 0xF000) и сдвиги (12), чтобы поменять местами самый высокий и самый низкий укус 16-битного значения. Но не забудьте оставить средние биты нетронутыми (верните их тоже):
#define swap(v) ((((v) & 0x000F) << 12) | (((v) & 0xF000) >> 12) | ((v) & 0x0FF0))
Поскольку назначение заключается в использовании макроса, а они не знают о типе передаваемого аргумента, для получения желаемого результата требуется также добавить приведение
short
результат и приведение операнда для правого сдвига для выполнения
unsigned
сдвиг:
#define swap(v) ((short int)((((v) & 0x000F) << 12) | (((unsigned)(v) & 0xF000) >> 12) | ((v) & 0x0FF0)))