2

私はCを学んでいて、まだ初心者です。

私の問題は次のとおりです。1 つの unsigned int x と 1 つの unsigned int y があります。xの位置pからnビットをyの同じ位置にコピーしたいと思います。同様の問題をいくつか見つけましたが、C にはありませんでした。ほとんどの場合、最も右または左のビットを使用する場合、問題はわずかに異なります。また、マシンの整数表現に依存しない解決策を見つけたいと思います。

これが私がしたことです

unsigned fix_bits(unsigned x, unsigned y, int n, int p)
{
    unsigned u1,u2,u3,u4,x1,y1,yf;
    u1 = ~0; /*vector of 1*/
    u2 = (u1>>n); /*0 from 0 to n-1 and 1s*/
    u3 = ~(u2);/*1 from 0 to n-1 and 0s*/
    u4 = u3>>p;/*0 from 0 to p-1, n 1 from p to p+n+1 and 0s*/
    x1 = (x & u4);/*only keep n bits of x from position p*/
    y1 = (y | u4);/*set y bit  from p to (p+n+1) to 1, rest remains unchanged (0 | bit = bit)*/
    yf = (x1 | y1);
    return yf;
}

しかし、それは機能しません:

28 から 32 の 3 番目の位置に 2 ビットを配置した結果は 402653216 です。

誰かが私が間違っていることを知っていますか?

どうもありがとうございました

4

5 に答える 5

2

問題について: xの位置pからnビットをyの同じ位置にコピーします

OP と同じように、コードで結果が得られます。

unsigned int x = 0xffffffff;
unsigned int y = 0x00000000;
unsigned int z = 0x00000000;
z = fix_bits(x, y, 5, 5);    

ここに画像の説明を入力

ターゲット番号の間違った端から操作しているようです。左 (MSB) ではなく、右 (LSB) から動作するようにロジックを変更します。

これを試して:

unsigned fix_bits(unsigned x, unsigned y, int n, int p)
{
    unsigned a, b, c, d, e;
    int mask;
    //Get mask
    mask = ((1<<(n))-1)<<(p-n); //[edit] corrected, was ...<<p, is ...<<(p-n)
    //apply mask to destination, 
    //XOR that with repositioned, BITwise NOTed source and apply mask
    /*so you can do these steps:
    a = mask|y;
    b = ~x;
    c = b<<p;
    d = c&mask;
    e = d^a;

    return e;*/
    //or do this one:  
    return ((mask&(~x<<p))^(mask|y)); //same thing
}  

表示されている入力の場合、出力例は次のとおりです。

unsigned int x = 0xffffffff;
unsigned int y = 0xf0000000;
unsigned int z = 0x00000000;

z = fix_bits(x, y, 3, 20);

ここに画像の説明を入力

マスク修正後の結果 ( was <<pis <<(p-n) ):

ここに画像の説明を入力

于 2013-11-03T17:17:31.663 に答える
0

したがって、私の最終的な実用的なソリューションは

unsigned fix_bits(unsigned x, unsigned y, int n, int p)

{

    unsigned u1,u2,u3,u4,x1,y1,yf;
    u1 = ~0; /*vector of 1*/
    u2 = (u1<<n); /*0 from 0 to n-1 and 1s*/
    u3 = ~(u2);/*1 from 0 to n-1 and 0s*/
    u4 = u3<<p;/*0 from 0 to p-1, n 1 from p to p+n+1 and 0s*/
    x1 = (x & u4);/*only keep n bits of x from position p*/
    y1 = (y | u4);/*set y bit  from p to (p+n+1) to 1, rest remains unchanged (0 | bit = bit)*/
    yf = (x1 | y1);
    return yf;

}

その後

x = 28 = [0 0 ... 0 1 1 1 0]

y = 32 = [0 0 ... 1 0 0 0 0]

fix_bits(28,32,2,3) / 28 から 32 までの位置 3 に 2 つのビットを配置する/

出力

z = 56 = [0 0 ... 1 1 1 0 0]

于 2013-11-05T21:06:50.173 に答える