按n个字节掩码

时间:2013-01-24 10:33:12

标签: c byte mask masking bitmask

我很难通过N个字节掩盖uint64_t变量。我不知道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或更多字节。正如评论所说,我的代码有效!也许我还有其他的错误!

3 个答案:

答案 0 :(得分:2)

根据[operator precendence table1],它应该可以工作。

但是,将其写成:

更清楚
mask <<= 8;
mask |= 0xff;

或:

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

当然,您也可以使用查找表来执行此操作。

答案 1 :(得分:1)

我不确定我的问题是否正确,但你的面具看起来像是

0x00000000000000ff
0x000000000000ffff
0x0000000000ffffff
...

我假设您需要类似以下的内容来屏蔽单个字节:

0x00000000000000ff
0x000000000000ff00
0x0000000000ff0000
...

为此,您可以使用例如以下代码:

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

    // Use the mask HERE
    ...

    mask = mask<<8;
}

答案 2 :(得分:0)

您可以使用此代码段,在byteno中使用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;
}

或者我的问题是错误的?