我在C ++中遇到一个奇怪的问题,我确信我错过了一些显而易见但却无法弄清楚的东西。
该函数的目的是设置变量的一些位。从我的测试来看,这一切似乎都有效,但看起来操作的结果没有分配回变量。
uint16_t setBits(uint16_t target, unsigned int source, int offset, int bitCount) {
unsigned int mask = ~0;
mask = mask >> ((sizeof(mask) * 8) - bitCount);
int rightShift = (sizeof(mask) * 8 - bitCount - offset);
mask = mask << rightShift;
source = source << rightShift;
printHex(target);
printHex((target & ~mask) | (source & mask));
target = (target & ~mask) | (source & mask);
printHex(target);
return target;
}
uint16_t group;
group = 0xabcd;
unsigned int source = 0x12;
group = setBits(group, source, 4, 8);
这将打印:
0x0000abcd
0x0120abcd
0x0000abcd
对我而言,(target & ~mask) | (source & mask)
表示正确的结果(0x0120abcd),但是此结果未分配回target
(仍设置为0x0000abcd)。知道我做错了吗?
答案 0 :(得分:4)
查看target
的类型:
uint16_t target
它只有16位,但你试图掩盖比这更高的位。