写作(1<<<<<<<<<<<<<<<<<<<<<<<<<<< 24>

时间:2011-05-25 13:16:09

标签: c

我在C中有一段代码,内容如下:

a = b & ((1<<24) - 1);

如果我没有误会,这相当于:

a = b & 0xFFFFFF;

写第一个在性能方面有什么好处?对我来说,阅读起来比较复杂,但我认为写这篇文章的人有比我更好的C背景。

由于

7 个答案:

答案 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位或更多位的整数。