Я пытаюсь создать макрос в c, целью которого является перезапись в обратном порядке битов каждой ячейки в массиве, например, если ячейка A[1] равна: 1100, последняя ячейка A[1] будет: 0011 .
Я создал макрос, но у меня проблема с компиляцией. Пожалуйста, дайте мне знать, если я ошибся (я уверен, что это может выглядеть более компактно, но я не хочу знать, что мне не хватает).
#include <stdio.h>
#define REVERSE(array, type) \
( \
type * p; \
unsigned (type)=mask1, mask2, test;\
mask1=1;\
mask2=mask1<<(sizeof(type)-1);\
for(p=(array);p ;p=p+1){\
while((mask1=<<1)<(mask2=>>1)){\
if(((*p)&mask1)!=((*p)&mask2)){\
if((*p)&mask1==0){\
*p=*p|mask1;\
*p=*p^mask2;\
}else{\
*p=*p^mask1;\
*p=*p|mask2;\
}\
}\
} \
)
int main(){
int i;
int array[]= {1,2,3,4,5};
REVERSE((array), int);
for(i=1; i<5; i++)
printf(" \'%d\' ", array[i]);
return(0);
}
-E
(gcc), чтобы проверить расширенный код C. В общем, не очень хорошая идея, чтобы макрос создавал такую сложную функцию. Обратите внимание, что код вполне может быть плохо оптимизирован. Многие современные процессоры имеют отдельные инструкции для реверсирования битовuint32_t
илиuint64_t
. Это, вероятно, в 100 раз быстрее, чем ваш подход. - person too honest for this site   schedule 29.06.2015