在C++中计算(-1)^ n的有效方法

bru*_*eck -3 c++ bit-manipulation

我想知道哪些是在位操作和代码长度方面计算(-1)^ n的最有效方法.

以下示例假设整数n:

int a=(n%2==0?1:-1);
int b=(n&1?-1:1);
Run Code Online (Sandbox Code Playgroud)

我不关心理解代码的简易性.

Max*_*kin 5

使用gcc 6.1都生成相同的程序集:

int f(int n) {
  return n % 2 ? -1 : 1;
}

int g(int n) {
  return n & 1 ? -1 : 1;
}
Run Code Online (Sandbox Code Playgroud)

部件:

f(int):
        movl    %edi, %eax
        andl    $1, %eax
        negl    %eax
        orl     $1, %eax
        ret
g(int):
        movl    %edi, %eax
        andl    $1, %eax
        negl    %eax
        orl     $1, %eax
        ret
Run Code Online (Sandbox Code Playgroud)

这相当于功能:

int h(int n) {
  return -(n & 1) | 1;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,gcc编译器4.4.7到5.3编译成更长的程序集,这些版本相同.