0

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

4

3 回答 3

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不丢失值)。

于 2013-01-31T09:20:00.253 回答
1

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

于 2013-01-31T09:13:12.843 回答
0

您可以先进行移位,然后对移位的掩码进行 AND 处理,以解决此问题。

于 2013-01-31T09:11:01.250 回答