我正在尝试在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);
}
答案 0 :(得分:0)
我建议使用查找数组。如果类型的大小大于char,则可以使用查找字节,然后将字节移动到正确的位置。没有点苦恼将使您的代码运行得更快。长度为256的char(byte)数组是一个平凡的大小。 Robert Cartaino in-place bit-reversed shuffle on an array的回答将告诉你我的意思。我认为他的数组可能很短,因为我希望将0xff交换为0xff。他的数组以0x7F结束。
答案 1 :(得分:0)
#define REVERSE(arr,sz,type) \
{ \
size_t i; \
for(i=0; i<(sz); i++) { \
type v1 = (arr)[i], v2 = 0; \
size_t j; \
for(j=0; j<8*sizeof(type); j++) { \
v2 = (v2 << 1) | (v1 & 1); \
v1 >>= 1; \
} \
(arr)[i] = v2; \
} \
}
注意:我添加了一个sz
参数来指定数组的长度。在您的代码中,for循环for(p=(array); p ;p=p+1)
适用于C字符串,但不适用于任何数字数组。