使用int和shift执行逐位AND

时间:2013-01-31 09:08:38

标签: c++ bit shift negative-number

此问题基于: Shift with 64 bit int 问题的起源是 - 我定义了一个enum,它提供了不同的面具。 并且需要在将结果右移之后使&(掩码)变量enum。 由于enum类型始终为int,因此该变量也被定义为int。但正如您所看到的那样,右移负数存在问题。 可以做些什么来解决这个问题?

3 个答案:

答案 0 :(得分:4)

首先,enum类型并不总是int;在C ++ 11中,你可以 甚至强迫它成为无符号类型。第二,即使是 基础类型是int,您可以(并且应该)自由地转换为 来自unsigned并没有真正的风险。例如,您可以超载 operator&因此:

MyEnum
operator&( MyEnum lhs, MyEnum rhs )
{
    return static_cast<MyEnum>(
        static_cast<unsigned>( lhs) & static_cast<unsigned>( rhs ) );
}

用于提取可能位于某处的字段:

int
getFieldX( MyEnum values )
{
    return static_cast<unsigned>(values & fieldXMask) >> fieldXOffset;
}

这将确保正确的行为(以及无符号值 已被转移,它应该转换为int而不会丢失 值)。

答案 1 :(得分:1)

我建议你在移位之前将枚举值静态转换为unsigned long long。我认为这是你可以使用的最安全的选择。

答案 2 :(得分:0)

你可以先进行转换,然后对着移动的掩码进行AND,以解决这个问题。