我想输入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)。
有什么好的解决方案吗?
答案 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个。