0

2つの符号なしchar_type変数aとbの間でビットのセグメントを交換したいと思います。セグメントがシーケンシャルでない場合、C言語で対処するにはどうすればよいですか?たとえば、aは011 * 001 * 10、入力セグメント長:5、開始位置pa = 5、セグメントはbit7〜bit5およびbit1〜bit0からのもので、01110です。bは10* 011 * 001、位置pb = 6、セグメントはbit6〜bit7およびbit2〜bit0からのもので、10001です。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 に答える