1

2つのunsignedchar変数aとbを入力したいと思います。aのビット0にa(0)を使用する場合、a(6)をa(1)に、b(6)をb(1)に交換したいと思います。最後に、2つの新しい符号なしchar_type変数を取得したいと思います。必要なビットが交換されたa1とb1です。この問題にC言語で対処する方法があることを知りたいですか?

さらに、長さの開始位置を決定するために、paとpbの2つの変数を追加する必要があります。例:pa = 6、pb = 7の場合、a(6)をa(1)に、b(7)をb(2)に交換する必要があります。

良い解決策はありますか?

4

3 に答える 3

3

xorマスキングを使用する傾向があります:

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 に答える