Member 13888750 Ответов: 3

Макрос для подкачки кусочка байтового исходного кода


Всем привет,

Мне задали вопрос в интервью.

не могли бы вы помочь мне в решении этого вопроса?

заранее спасибо.

Что я уже пробовал:

Hi all,

I was asked by a question in a interview.

could you please help me out in solving this question.

thanks in advance.

3 Ответов

Рейтинг:
2

Mohibur Rashid

Будет ли работать 16 битный или 32 битный или 64 битный процессор

#include<stdio.h>
#define HALFWIDTH() (sizeof(short int) << 2)
#define BITSWAP(p)     (unsigned short)(p << HALFWIDTH()) | (unsigned short)(p >> HALFWIDTH())
int main() {
  unsigned short i;
  printf("half short: %d\n", HALFWIDTH());
  printf("read the number: \n");
  scanf("%hu", &i);
  printf("shift left: %hu\n", (unsigned short)(i << HALFWIDTH()));
  printf("shift right: %hu\n", (unsigned short)(i >> HALFWIDTH()));
  printf("%hu\n", BITSWAP(i));
  return 0;
}


Рейтинг:
1

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)))


Рейтинг:
0

KarstenK

Макрос - это не функция. Прочитайте сравнение из обоих, чтобы узнать различия.

#define SWAPNIBBLES(c) ( (c << 4) + (c >> 4) } 

Мне не нравятся макросы, потому что они не отлаживаются, и компилятор может оптимизировать функции так же хорошо или даже лучше, чем макросы. Использование макросов-это программирование в 80-х годах.