1

int x、int n、および int m の 3 つのパラメーターを受け取るメソッドがあります。x の n 番目と m 番目のバイトを入れ替えた int を返します。

x は通常の整数で、任意の値に設定されます。n と m は 0 から 3 までの整数です。

たとえば、x の 16 進表現を 0x12345678、n を 0、m を 2 とします。最後のバイトと最後から 3 番目のバイトが入れ替わることになっています (n = 78、m = 34)。

x から n 番目と m 番目のバイトを抽出する方法はわかりましたが、メソッドが返すはずの整数に 4 バイトすべてを再結合する方法がわかりません。

これが私の現在のコードです: `

int byteSwap(int x, int n, int m)
{
    // Initialize variables which will hold nth and mth byte
    int xn = x;
    int xm = x;
    // If n is in bytes, n << 3 will be the number of bits in that byte
    // For example, if n is 2 (as in 2 bytes), n << 3 will be 16 (as in 16 bits)
    xn = x >> (n << 3);
    // Mask off everything except the part we want
    xn = xn & 0xFF;
    // Do the same for m
    xm = x >> (m << 3);
    xm = xm & 0xFF;
}

`

追加の制約がいくつかあります。次のもののみが許可されます。

~ & ^ | ! + << >>

(これは no - * /、 loops 、ifs などを意味します。ただし、追加の変数を初期化することはでき、追加はまだ OK です。)

私のコードは n 番目と m 番目のバイトを抽出できますが、ifs を使用せずにすべてを再結合する方法がわかりません。

4

1 に答える 1

1

いくつかのこと

バイト m と n を除いてすべて FF の値で x をマスクすることで再結合できます

int mask = 0;
int mask_m = 0xFF << (m << 3);
int mask_n = 0xFF << (n << 3);

mask = (mask_m | mask_n) ^ 0xFFFFFFFF;

int x_swapped = (x & mask) | (xm << (n <<3)) | (xn << (m <<3));
return x_swapped;

参考までに、符号付きの値を右シフトすると、0 の代わりに 1 が上位ビットに伝播される場合と伝播されない場合があり、実装で定義されています。どちらにしても 0xFF はそれを防ぎます。

于 2014-01-26T02:22:37.607 に答える