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

时间:2017-12-29 06:29:28

标签: c

直截了当。我想更改变量的高8位。

ULONG parameters;

我可以这样得到他们:

(parameters >> 24) & 0xFF

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

2 个答案:

答案 0 :(得分:3)

您可以使用以下方法清除高8位:

value &= 0x00FFFFFF;

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

value |= 0xFF000000;

答案 1 :(得分: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)

只要设置了位掩码和移位值,它就可以正常工作。如果要设置范围内的位:enum { shift = 8, bitmask = 0x00ffff00, // mask for bits [8, 24) }; (16位),我们只需执行:

(float)

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