我遇到很多场合,我必须在除法运算符(除以2)或右移运算符(>>)之间使用但我倾向于使用除法运算符,假设使用位运算符将使我代码不太可读。我的假设是真的吗?
在生产代码中使用左移运算符和右移运算符而不是乘以2或除以2是否是一种好习惯。
答案 0 :(得分:2)
使用按位运算符进行乘法或除以2是完全疯狂的。
对于负面签名类型,<<
的行为未定义。
<<
和>>
的优先级低于加法和减法,所以它会弄乱你的表达。
它不必要地混淆。
相信现代编译器可以适当优化。
答案 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);
}
通常,大多数情况下,您将对有符号整数使用除法,对无符号整数使用按位运算符。