开门见山。我想改变变量的高8位。
ULONG parameters;
我可以这样得到它们:
(parameters >> 24) & 0xFF
但我不确定如何清除那里的价值并设定我自己的价值。
如果要清除这些位并将它们设置为零:
parameters &= 0x00ffffff; // (mask for bits [0, 24)
或者,假设您有一个高8位的掩码:
enum {bitmask = 0xff000000}; // (mask for bits [24, 32)
您也可以使用掩码的补码清除那些高8位(位[24, 32)
或[24, 31]
):
parameters &= ~bitmask; // (~0xff000000 == 0x00ffffff)
如果你能避免它,那么使用按位补码在这里看起来似乎很浪费但是如果在编译时知道bitmask
,那么优化器通常足以消除它。如果你想设置范围内的位,[24, 32)
到some_value
然后:
parameters &= ~bitmask; // clear bits [24, 32)
parameters |= (some_value << 24); // shift some_value to occupy
// bits [24, 32) and combine the
// bits.
请注意,some_value
应该具有适合8位的范围。我们基本上左移这8位占据位[24, 32)
。然后bitwise or
组合了这些位,在清除那些高8位之后,它们具有将它们设置为该值的效果。然后,您可以使用以下方法再次将值拉回:
some_value = (parameter >> 24);
如果你可以保证bitwise and
是32位或者不会使用/设置超过32位的任何位,你实际上不需要在这里使用0xff
进行parameter
。除此以外:
some_value = (parameter >> 24) & 0xff;
或者,如果您有方便的位掩码:
some_value = (parameter & bitmask) >> 24;
通常,定义掩码和移位值都很方便,如下所示:
enum
{
shift = 24,
bitmask = 0xff000000, // mask for bits [24, 32)
};
然后你可以概括为:
// fetching some value:
some_value = (parameter & bitmask) >> shift;
// setting some value:
parameter = (parameter & ~bitmask) | (some_value << shift);
只要你设置了位掩码和移位值,它就可以工作。如果你想设置范围内的位:[8, 24)
(16位),那么我们只需:
enum
{
shift = 8,
bitmask = 0x00ffff00, // mask for bits [8, 24)
};
上面的代码应该可以正常工作。
你可以清除高8位:
value &= 0x00FFFFFF;
请注意,实际上并不需要00,它只是为了清晰起见。如果你想设置所有高8位:
value |= 0xFF000000;