3

2 つの 2 進数0011001011101110があり、最後の 4 つの値を 2 番目から 1 番目にコピーして、2 進数 を形成するとし00111110ます。2 バイト (またはそれ以上のデータ型) でビット演算を使用してこれを行うクリーンな方法はありますか。バイナリ パックされたデータ型を想定します。

また、サブセットをコピーできるこの問題に対する一般的な解決策はありますか。中間の 3 ビットをある数値から別の数値にコピーしたいとしましょう。これを達成するための最良の方法は何ですか?

4

2 に答える 2

6

入力がxありy、特定のビット セットを から にコピーしたいx場合y、たとえば、1ある変数の s であるビットm(コピーしたいビットのマスク) をコピーしたい場合、次のように実行できます。

int copy(int x, int y, int m) {
    return ((x & m) | (y & (~m)));
}

これは、s 、s、 sintなど、sより大きいまたは小さいものでも機能します。charshortlong

取得(x & m)すると、その位置に a がある for のビットのみが得られ、その位置に axがないforのビットのみが得られます。m1(y & (~m))ym1

次に、これらを と一緒に OR して、 の位置のビットが から来て、の位置のビットがから来|た値を与えます。m1xm0y

あなたの特定のケースには、、、x = 0xeeおよびy = 0x32がありm = 0xFます。

于 2013-09-30T17:07:23.617 に答える
1

あなたはこれを試すことができます

#include "stdio.h"

    int main()
    {
            int a = 0x52;
            int b = 0xee;

            int c = (a&0xF0)|(b&0x0F);


            printf(" %x %d\n",  c, c);

    }

aは00110010、bは11101110

于 2013-09-30T17:14:10.623 に答える