使用位智能使代码不可读

时间:2016-08-19 13:58:16

标签: c++ algorithm operators bit-manipulation

我遇到很多场合,我必须在除法运算符(除以2)或右移运算符(>>)之间使用但我倾向于使用除法运算符,假设使用位运算符将使我代码不太可读。我的假设是真的吗?

在生产代码中使用左移运算符和右移运算符而不是乘以2或除以2是否是一种好习惯。

2 个答案:

答案 0 :(得分:2)

使用按位运算符进行乘法或除以2是完全疯狂的。

  1. 对于负面签名类型,<<的行为未定义。

  2. <<>>的优先级低于加法和减法,所以它会弄乱你的表达。

  3. 它不必要地混淆。

  4. 相信现代编译器可以适当优化。

答案 1 :(得分:2)

常数除以常数通常优化为位移(如果是2的幂),乘以“积分倒数”和所有类型的技巧,因此性能不应该是一个问题。

重要的是明确表达意图。如果你使用“作为数字”的整数进行操作,并且除以恰好是2的幂,则使用除法运算符。

int mean(int a, int b) {
    return (a+b)/2; // yes overflow blah blah
} 

如果您将整数作为位域进行操作 - 例如,您正在解压缩半字节并且您需要右移4以将其移动到“低”位置,或者您需要显式设置一些位 - 然后使用按位运算符。

void hex_byte(unsigned char byte, char *out) {
    out[0]=byte>>4;
    out[1]=byte&0xf;
} 

unsigned set_bit(unsigned in, unsigned n) {
    return in | (1<<n);
} 

通常,大多数情况下,您将对有符号整数使用除法,对无符号整数使用按位运算符。