我在C中有一段代码,内容如下:
a = b & ((1<<24) - 1);
如果我没有误会,这相当于:
a = b & 0xFFFFFF;
写第一个在性能方面有什么好处?对我来说,阅读起来比较复杂,但我认为写这篇文章的人有比我更好的C背景。
由于
答案 0 :(得分:14)
由于编译器会为您执行计算,因此性能没有差异。
第一个选项可用于明确说明您使用的是24个设置位。这在第二个选项中更难计算。
答案 1 :(得分:8)
很可能,没有任何性能差异,因为编译器会发现((1<<24) - 1)
是一个常量表达式,并将在编译时对其进行评估。
我们只能推测为什么代码的原作者选择以他们的方式编写它。也许他们认为它更好地表达了意图(“掩盖除b
的24个最低位之外的所有内容”。
如果这是他们的推理,我个人倾向于同意他们。
答案 2 :(得分:2)
我不能从性能的角度看到任何好处,正如aix所说。
对我而言,无论如何,在第一个版本中看起来更清楚,更好地传达了常数值比后一种形式的2 ^ 24-1。当然,我想这只是一个意见。
答案 3 :(得分:2)
如果它不是更大代码块的一部分,我更喜欢您使用0xFFFFFF
。
但是,可以想象它可以成为一组类似陈述的一部分。然后换班版本(可以说)更好。
switch (binaryprefix) {
default: a = 0; break;
case DECABIN: a = b & ((1 << 1) - 1); break;
case HECTOBIN: a = b & ((1 << 2) - 1); break;
case KILOBIN: a = b & ((1 << 3) - 1); break;
case MEGABIN: a = b & ((1 << 6) - 1); break;
/* ... */
case ZETTABIN: a = b & ((1 << 21) - 1); break;
case YOTTABIN: a = b & ((1 << 24) - 1); break;
}
答案 4 :(得分:1)
执行((1<<24) - 1)
的效果没有任何好处。它可能会更慢,因为它必须执行一些操作(<<
和-
),而0xFFFFFF
是常量。最好的情况是编译器将在编译时计算第一个并且它们是等效的。
答案 5 :(得分:1)
通常,您应该避免使用第一个语句。
我能想到的第一句话更可取的唯一情况是,如果数字24有意义。 (无论如何都应该定义和命名。)
就像,如果出于某种原因,在这行代码中它可以是24,而在不同的地方它可能是22。
答案 6 :(得分:0)
严格来说,表达方式
(1<<24)
是不可移植的,可能是未定义的行为,因为1被视为int,而标准只保证int的16位。如果你仍然碰巧为这样的实现编写代码...如果a和b是整数,那么你可以安全地推断出目标只是更现代的实现,当然有32位或更多位的整数。