0

我需要将每两个相邻的位交换为通用操作,这将对给定的每个变量类型执行此操作。

我想到了每个字节所需的掩码和操作:

(var & 0x55) << 1 | (var & 0xAA) >> 1

但是我该如何申请让我们说一个整数?我是否需要sizeof(int) unsigned char使用上述掩码创建一个 s 数组并以这种方式应用操作?

4

3 回答 3

4

您可以逐个字节地执行此操作(与逐个字符的字符相同)。

例如:

int n = 0xAA55A55A;
unsigned char *p = (unsigned char *) &n;

for (; p < (unsigned char *) &n + sizeof(n); p++)
   *p = (*p & 0x55) << 1 | (*p & 0xAA) >> 1;
于 2013-09-26T17:25:15.033 回答
2

两个建议:您可以使用 256 个字符的查找表,而不是使用逻辑运算:

char lookUpTable[256] = {0x00, 0x02, 0x01 ...};

如果您不想静态初始化此查找,您可以编写一个使用逻辑操作对其进行初始化的函数。

当你想交换字节 b 时,你要么简单地写 lookUpTable[b],要么用一个函数包装它。

至于交换任何类型,您编写一个执行以下操作的函数:

void SwapBits(char* data, size_t len)
{
    For (; len > 0; len--)
    {
        *data = lookUpTable[*data];
        data++;
    }
}

然后你像这样使用它:

AnyType swapMe = whatever;
SwapBits((char*)(&swapMe), sizeof(AnyType));

请注意,这替换了 swapMe 的“内容”。

还有一件事,右移行为是特定于架构的,某些架构可能会在右移时符号扩展。使用如下表达式会更通用:

SwappedByte = ((Byte >> 1)&0x55) | ((Byte << 1)&0xaa)

通过这种方式,您可以删除任何符号扩展工件。

于 2013-09-26T17:43:42.787 回答
1

像这样的东西。将任何变量的地址转换为 char * 并且您可以遍历字节。

#include <stdio.h>

char swap_c(char);
void swap_r(char *, int);

int main(void) {
    char c = 10;
    c = swap_c(c);
    printf("%i\n", c);
    int i = 10;
    char * r = (char *) &i; //you can cast the address of any variable into a char *
    swap_r(r, sizeof(int));
    printf("%i\n", i);
}

void swap_r(char * c, int length) {
    int i = 0;
    while(i < length) {
        c[i] = swap_c(c[i]);
        i++;
    }       
}

char swap_c(char c) {
    return (c & 0x55) << 1 | (c & 0xAA) >> 1;
}

//1010
//0101
于 2013-09-26T17:33:27.797 回答