繁体   English   中英

与int和移位执行按位与

[英]performing bit-wise AND with int and shifting

该问题基于: 64位int移位问题的起源是-我定义了一个enum ,它表示不同的掩码。 并且需要在将结果右移后用enum (掩码)使&成为变量。 由于enum类型始终为int ,因此变量也定义为int 。但是如您所见,向右移负数存在问题。 该怎么解决呢?

首先, enum类型并不总是int 在C ++ 11中,您甚至可以将其强制为无符号类型。 其次,即使基础类型为int ,您也可以(并且应该)自由地进行unsignedunsigned ,而没有真正的风险。 例如,您可以使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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM