【问题标题】:Unexpected results from bitwise logic operation按位逻辑运算的意外结果
【发布时间】:2012-09-02 07:12:21
【问题描述】:

给定一个这样定义的枚举:

enum DebugModeType {
    DebugModeNone = 0,
    DebugModeButton = 1,
    DebugModeFPS = 2,
    DebugModeData = 4
};
#define DebugMode DebugModeButton|DebugModeData

我预计 DebugMode&DebugModeFPS 的值为 0,但我观察到它是 1。

【问题讨论】:

    标签: operators bit-manipulation bitwise-operators


    【解决方案1】:

    您需要在宏中使用括号来克服运算符优先级:

    #define DebugMode (DebugModeButton|DebugModeData)
    

    原样:

    DebugMode & DebugModeFPS

    = DebugModeButton | DebugModeData & DebugModeFPS

    (解析为DebugModeButton | (DebugModeData & DebugModeFPS)

    = DebugModeButton | (4 & 2)

    = DebugModeButton | 0

    = DebugModeButton

    = 1

    按照我的建议使用括号:

    = (DebugModeButton | DebugModeData) & DebugModeFPS

    = 5 & DebugModeFPS

    = 5 & 2

    = 0

    【讨论】:

    • 不错不错。 #define DebugMode (DebugModeButton|DebugModeData) 或#define DebugMode DebugModeButton+DebugModeData 也可以。给它一个高优先级。非常感谢。
    • 更好的是,不要使用宏,使用常量,避免任何其他宏陷阱。
    • @zszen 我建议不要使用 + 运算符,因为如果您已经设置了一些位标志,您最终会取消设置它并无意中设置一些其他标志。
    • @理查德。 Thx,我现在通常使用位运算符而不是 + 运算符
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多