1

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

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

有什么好的解决办法吗?

4

3 回答 3

3

我倾向于使用异或掩码:

mask = 0x3e;    // 0b00111110
diff = (a & mask) ^ (b & mask);
a1 = a ^ diff;
b1 = b ^ diff;
于 2012-09-25T12:19:52.243 回答
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);
于 2012-09-25T12:22:03.713 回答
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 的解决方案只需要 5 次。

于 2012-09-25T12:31:01.787 回答