按位与逻辑

时间:2012-09-07 02:50:25

标签: c++ bit-manipulation

编辑:在C ++中 如果我有,我需要测试8个标志。哪个在处理速度方面更有效:

在单个if语句中检查8个bool变量,或者使用表示标志的char,每个标志使用1位并在单个if语句中使用单个按位运算?

如果我有一个标志要测试,那会有所作为吗?

4 个答案:

答案 0 :(得分:5)

如果您要检查所有位的已知值,那么比较char可能会更快:

if (bitval == 0x82) ...

如果你想检查某些位,忽略其他位,可能可以更快地将“位”保存在单独的变量中:

if ((bitval7 == 1) && (bitval1 == 1)) ...

或者简单地掩盖你不关心的位可能会更快:

if ((bitval & 0x82) == 0x82) ...

如果您真的担心,可以选择以两种方式存储它们(前提是保持它们同步)并根据您感兴趣的位数选择。

但我认为这种严重的矫枉过正,因为,老实说,速度差异很小,可能是无关紧要的。

如果您要进行优化,您几乎总能获得更好的投资回报,例如算法选择等宏观优势,而不是微观优化,例如分离布尔值或改变循环方向。

不要误解我的意思,这些微观优化可以在某些情况下发挥作用,但它们通常不是最佳方式。

答案 1 :(得分:1)

这个问题实际上归结为编译器。这取决于它如何引用要检查的位,但是,我相信可以肯定地说,只要您检查多个位,char就会更快。

通过char运行所需的时钟周期数明显短于单个变量,因为标志在内存中相邻堆叠,从而消除了内存寻址的要求。

如果你想要明显的速度差异,除非你改变你的检查方法,否则你不会得到它。

答案 2 :(得分:1)

我通常是按位标志的粉丝,但我发现拥有一些支持功能通常很有用:

inline bool TestAll( char flags, char value ) {
    return (flags & value) == value;
}

inline bool TestAny( char flags, char value ) {
    return (flags & value) != 0;
}

inline bool TestAllExclusive( char flags, char value ) {
    return flags == value;
}

inline bool TestAnyExclusive( char flags, char value ) {
    return (flags & value) != 0 && (flags & ~value) == 0;
}

你也可以做类似的功能来拍摄旗帜面具,让所有神奇的东西更容易阅读。

如果您有测试的真值,那么就速度而言,这是一个胜利者,因为您只是处理常数。

typedef enum EmotiveFlags {
    E_ELATED       = 0x01,
    E_JOYOUS       = 0x02,
    E_NONPLUSED    = 0x04,
    E_BEWILDERED   = 0x08,
    E_ANNOYED      = 0x10,
    E_PUZZLED      = 0x20,
    E_ENRAGED      = 0x40,
    E_AMUSED       = 0x80
} EEmotiveFlags;

if( TestAny(flags, E_JOYOUS | E_ELATED | E_AMUSED) ) {
   //...
}
else if( TestAll(flags, E_ANNOYED | E_ENRAGED) && !TestAll(flags, E_AMUSED) ) {
   //...
}

答案 3 :(得分:0)

嗯,最好的选择是将代码编译成汇编程序并检查它。

8个bool标志需要8个寄存器。这很多。 8位标志只需要一个寄存器。如果将所有标志放在一个寄存器中,则测试速度非常快。