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