【问题标题】:swap bits in different positions in 2 char_type variables交换 2 个 char_type 变量中不同位置的位
【发布时间】:2012-09-26 12:44:30
【问题描述】:

我想在 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 中,然后使用 ^ 完成交换。方法太复杂了。有什么棘手的想法吗?

【问题讨论】:

  • I tried to use 2 temp variables ... 你为什么不向我们展示你的尝试?
  • 仔细检查一下,您是说您有a=011(001)10b=10(011)001,并且您想交换一部分位,例如a=011(011)10b=10(001)001
  • 我用了三个临时变量,方法并不复杂。
  • @Mike 我的预期结果是:a1=110(001)10 和 b1=11(011)100。 () 中的位应保留,() 中的位应交换。更清晰易懂?
  • @LihO 我已经更改了问题的内容,并在那里描述了我的想法。

标签: c byte swap


【解决方案1】:

剧透:(我使用比 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);
}

【讨论】:

  • 非常感谢。这个解决方案终于解决了我的问题。
  • 我仍然不明白 unsigned *a 代表什么,因此 a 是一个 char_type 变量。对了,“(*a >> posa)”是什么意思?
  • 正如我所说:我将类型更改为无符号 (int)。您可以轻松地将unsigned 更改为unsigned char*a 表示“指针取消引用”(取 a 指向的值)。叹息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多