以2个字节交换一个位长度

时间:2012-09-25 12:11:26

标签: c byte swap

我想输入2个unsigned char变量:a和b。如果在a中对位0使用a(0),我想将a(6)与b(6)交换为a(1)到b(1)。最后,我希望获得2个新的无符号char_type变量:a1和b1,其中交换了所需的位。我很想知道有没有用C语言解决这个问题的方法?

进一步的要求是添加2个变量:pa和pb来决定长度的起始位置。例如:如果pa = 6,pb = 7,我必须将a(6)与a(1)交换为b(7)到b(2)。

有什么好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

我倾向于使用xor masking:

mask = 0x3e;    // 0b00111110
diff = (a & mask) ^ (b & mask);
a1 = a ^ diff;
b1 = b ^ diff;

答案 1 :(得分:1)

啊哈。我现在明白了

unsigned const char mask = 0x3e;

usigned char a,b; // input somehow

unsigned char a2=a, b2=b;

a2 = (a2 & ~mask) | (b & mask);
b2 = (b2 & ~mask) | (a & mask);

答案 2 :(得分:0)

给定整数,例如:

uint32_t a = 0xff00ff00;
uint32_t b = 0x00ff00ff;

这是你交换整个值的方式:

a ^= b;
b ^= a;
a ^= b;

如果您只想交换特定位,请在其中添加一个掩码:

uint32_t mask = 0x0000ffff; // only swap the lower 16 bits
a ^= (b & mask);
b ^= (a & mask);
a ^= (b & mask);

上述操作需要6个按位操作,而ecatmur's solution只需要5个。