如何在数组单元格中为反向位顺序创建宏

时间:2015-06-29 18:54:10

标签: c macros bitwise-operators

我正在尝试在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);
}

2 个答案:

答案 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字符串,但不适用于任何数字数组。