0

uint64_t 変数を N バイトずつマスクするのに苦労しています。N はわかりませんが、8 以下であることはわかっています。私の現在のコードは次のようになります。

// uint64_t n is given
uint64_t mask;
for( mask = 0x00; n; n--) {
    mask = mask<<8 | 0xFF;
}

マスクを作成するため。ここで何が間違っていますか?

編集:
質問に答えました。とにかく、理解を深めるために:

次のようなマスクが欲しいです。

0x000000FF // or:
0x0000FFFF // or:
0x00FFFFFF

データから 1、2、またはそれ以上のバイトを取得します。コメントが言うように、私のコードは機能します! 他にバグがあったのかもしれません!

4

3 に答える 3

2

[operator precendence table1] によると、動作するはずです。

それでも、次のように書く方がより明確です。

mask <<= 8;
mask |= 0xff;

また:

mask = (mask << 8) | 0xff;

もちろん、ルックアップ テーブルを使用することもできます。

于 2013-01-24T10:37:18.513 に答える
1

質問が正しいかどうかはわかりませんが、あなたのマスクは次のようになります

0x00000000000000ff
0x000000000000ffff
0x0000000000ffffff
...

個々のバイトをマスクするために、次のようなものが必要だと思います。

0x00000000000000ff
0x000000000000ff00
0x0000000000ff0000
...

このために、例えば次のコードを使用することができます:

for( mask = 0xff; n; n--) {

    // Use the mask HERE
    ...

    mask = mask<<8;
}
于 2013-01-24T10:47:27.743 に答える
0

次のコード スニペットを使用して、次のbytenoth バイトをdestマスクに置き換えることができsrcます。

uint64_t replacemyByte(uint64_t src, uint64_t byteno,uint64_t dest) 
{
    uint64_t shift = (dest << (8 * byteno));
    uint64_t mask = 0xff << shift;
    return (~mask & src) | shift;
}

それとも質問を間違えましたか?

于 2013-01-24T10:49:38.860 に答える