如何清除和设置ULONG的高8位

问题描述 投票:0回答:2

开门见山。我想改变变量的高8位。

ULONG parameters;

我可以这样得到它们:

(parameters >> 24) & 0xFF

但我不确定如何清除那里的价值并设定我自己的价值。

c
2个回答
1
投票

如果要清除这些位并将它们设置为零:

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)
};

上面的代码应该可以正常工作。


3
投票

你可以清除高8位:

value &= 0x00FFFFFF;

请注意,实际上并不需要00,它只是为了清晰起见。如果你想设置所有高8位:

value |= 0xFF000000;
© www.soinside.com 2019 - 2024. All rights reserved.