我很难通过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或更多字节。正如评论所说,我的代码有效!也许我还有其他的错误!
答案 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;
}
或者我的问题是错误的?