C 交换2字节中的位长度

C 交换2字节中的位长度,c,byte,swap,C,Byte,Swap,我想输入2个无符号字符变量:a和b。如果a中的位0使用a0,我想将a6换成a1,将b6换成b1。最后,我希望得到两个新的无符号字符类型变量:a1和b1,交换了所需的位。我想知道有没有用C语言解决这个问题的方法 另一个要求是添加两个变量:pa和pb,以确定长度的起始位置。例如:如果pa=6,pb=7,我必须将a6换成a1,将b7换成b2 有好的解决方案吗?我倾向于使用异或屏蔽: mask = 0x3e; // 0b00111110 diff = (a & mask) ^ (b &am

我想输入2个无符号字符变量:a和b。如果a中的位0使用a0,我想将a6换成a1,将b6换成b1。最后,我希望得到两个新的无符号字符类型变量:a1和b1,交换了所需的位。我想知道有没有用C语言解决这个问题的方法

另一个要求是添加两个变量:pa和pb,以确定长度的起始位置。例如:如果pa=6,pb=7,我必须将a6换成a1,将b7换成b2


有好的解决方案吗?

我倾向于使用异或屏蔽:

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

我倾向于使用xor掩蔽:

mask = 0x3e;    // 0b00111110
diff = (a & mask) ^ (b & mask);
a1 = a ^ diff;
b1 = b ^ diff;
啊哈。我现在明白了

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);
啊哈。我现在明白了

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);
给定整数,例如:

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个位运算,而只需要5个给定整数,例如:

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位运算,而只需要5位。

您必须在这里给出示例。这个问题对我来说没有任何意义,我想输入2个无符号字符变量:a和b。如果a中的位0使用a0,我想将a6换成a1,将b6换成b1。最后,我希望得到两个新的char变量:a1和b1,并交换所需的位。是否有任何可能的方法用C语言解决这个问题?您可以并且应该编辑question@JonathanGrynspan这是家庭作业的一部分。如果两个无符号字符变量的起始位置不同,我现在有点困惑。对此问题的任何尝试都将不胜感激。您必须在这里给出示例。这个问题对我来说没有任何意义,我想输入2个无符号字符变量:a和b。如果a中的位0使用a0,我想将a6换成a1,将b6换成b1。最后,我希望得到两个新的char变量:a1和b1,并交换所需的位。是否有任何可能的方法用C语言解决这个问题?您可以并且应该编辑question@JonathanGrynspan这是家庭作业的一部分。如果两个无符号字符变量的起始位置不同,我现在有点困惑。对此问题的任何尝试都将不胜感激。这难道不是正常的任务吗?非常感谢您的回答~我已经在问题中添加了一些进一步的要求。有什么解决办法吗?@Xeo-Oops。很晚才发现你的评论。谢谢这不是正常的任务吗?非常感谢你的回答~我在问题中增加了一些进一步的要求。有什么解决办法吗?@Xeo-Oops。很晚才发现你的评论。非常感谢您的解决方案。我想做的是更进一步:在2个字节中交换的位的位置是不同的。例如,uchar8a=0xf0,uchar8b=0x0f。我想用b的位1和位0交换a的位7和位6。在C语言中有什么方法可以做到这一点吗?您需要使用移位来实现这一点。请再发一个问题。非常感谢您的解答。我想做的是更进一步:在2个字节中交换的位的位置是不同的。例如,uchar8a=0xf0,uchar8b=0x0f。我想用b的位1和位0交换a的位7和位6。在C语言中有什么方法可以做到这一点吗?您需要使用移位来实现这一点。再发一个问题。