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

根据[运算符优先级表1],它应该可以工作。

不过,将其写为:

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

您可以使用此代码片段将byteno第 th 字节替换为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 回答