我需要将每两个相邻的位交换为通用操作,这将对给定的每个变量类型执行此操作。
我想到了每个字节所需的掩码和操作:
(var & 0x55) << 1 | (var & 0xAA) >> 1
但是我该如何申请让我们说一个整数?我是否需要sizeof(int)
unsigned char
使用上述掩码创建一个 s 数组并以这种方式应用操作?
我需要将每两个相邻的位交换为通用操作,这将对给定的每个变量类型执行此操作。
我想到了每个字节所需的掩码和操作:
(var & 0x55) << 1 | (var & 0xAA) >> 1
但是我该如何申请让我们说一个整数?我是否需要sizeof(int)
unsigned char
使用上述掩码创建一个 s 数组并以这种方式应用操作?
您可以逐个字节地执行此操作(与逐个字符的字符相同)。
例如:
int n = 0xAA55A55A;
unsigned char *p = (unsigned char *) &n;
for (; p < (unsigned char *) &n + sizeof(n); p++)
*p = (*p & 0x55) << 1 | (*p & 0xAA) >> 1;
两个建议:您可以使用 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)
通过这种方式,您可以删除任何符号扩展工件。
像这样的东西。将任何变量的地址转换为 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