[英]performing bit-wise AND with int and shifting
首先, enum
类型并不总是int
; 在C ++ 11中,您甚至可以将其强制为无符号类型。 其次,即使基础类型为int
,您也可以(并且应该)自由地进行unsigned
和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
不会丢失值)。
我建议您在转换前unsigned long long
就将枚举的值静态转换为unsigned long long
。 我认为这是您可以使用的最安全的选择。
您可以先进行移位,然后对移位的掩码进行“与”操作来解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.