高性能位移除(异或与减法)

High Performance Bit Removal (XOR vs. subtract)

我的理解是 XOR 会干扰分支预测。

对于将 运行 多次的操作,通过减法或异或删除位是否更可取?

// For an operation that will run several million times ...
int encoding = 180391281; // could be anything but we'll pick a number ...
#define REMOVE_BITS (128+64)

int bits_to_remove = encoding & REMOVE_BITS;
int encoding_with_bits_removed_xor_method      = encoding ^ /*XOR*/ bits_to_remove; // BEST?
int encoding_with_bits_removed_subtract_method = encoding - /*SUB*/ bits_to_remove; // BEST?

如果你钻研数字电子电路;对于按位布尔运算(AND、OR、XOR、XNOR),每个位都可以并行完成,而对于 addition/subtraction 它们不能(最低位对中的 carry/borrow 影响结果下一个最高的位对,它...)。

但是; CPU 很复杂,为了保持所有部分同步,通常所有内容(不包括极其罕见的 asynchronous/clockless 设计,如 GreenArrays 的芯片)都会四舍五入到最接近的时钟周期;因此,可以在 0.5 个周期内完成的 XOR 将花费 1 个整个周期,而一个可以在 0.9 个周期内完成的 SUB 将花费相同的 1 个整个周期。

换句话说;一般来说,XOR(或 AND)和 SUB 之间的性能差异极小(但我仍然更喜欢 XOR 或 AND,因为它“理论上 CPU 更简单”并且成本可能略低功耗)。

一个更重要的考虑因素(特别是对于高级语言,其中有一个应该为您进行微优化的编译器)是源代码的可读性。对于位删除,AND 是常见的做法,而 SUB 是不常见的(更可能短暂地混淆 reader)。 XOR 是合理的,如果它可以帮助您避免 NOT(例如 a = b ^ c 并不比 a = b & (~c) 更难理解);但是您可以颠倒术语(例如,将“要删除的位”替换为“位掩码”)并以 a = b & c 结尾而没有 NOT,如果您可以这样做,则可能会提高可读性。