0

我想在 2 个 unsigned char_type 变量之间交换一段位:a 和 b。如果段不是连续的,如何用 C 语言解决它?例如 a 为011* 001 *10,输入段长度:5,起始位置 pa=5,段从 bit7~bit5 到 bit1~bit0 ,即011 10;b 为10* 011 *001,位置 pb=6,段来自 bit6~bit7 和 bit2~bit0,即10 001。2 段具有相同的长度。预期结果应该是这样的:a1= 11000100, b1= 11011001

我尝试使用 2 个临时变量 x 和 y 将交换位存储在 b 和 a 中,然后使用 ^ 完成交换。方法太复杂了。有什么棘手的想法吗?

4

1 回答 1

0

剧透:(我使用比 char 更大的类型)

void swapmask(unsigned *a, unsigned *b, unsigned posa, unsigned posb, unsigned len)
{
unsigned mask, fraga, fragb;

#include <limits.h>
if (len >= CHAR_BIT* sizeof *a) return ;
if (posa >= CHAR_BIT* sizeof *a) return ;
if (posb >= CHAR_BIT* sizeof *b) return ;

mask = (1u << len) -1;
fraga = (*a >> posa) & mask;
fragb = (*b >> posb) & mask;

fprintf(stderr, "Mask=%x Fa=%x, Fb=%x\n", mask, fraga, fragb);

*a = (*a & ~(mask << posa)) | (fragb << posa);
*b = (*b & ~(mask << posb)) | (fraga << posb);
}
于 2012-09-26T16:25:55.197 回答