2016-05-30 3 views
-3

I(-1)を計算するための最も効率的な方法であるかを知りたい^ Nビット演算と符号長の点で計算します。効率的な方法は、(-1)^ nはC++で

int a=(n%2==0?1:-1); 
int b=(n&1?-1:1); 

私はコードの理解を容易にする気にしない:

次の例では、整数nを前提としています。 gcc 6.1 both produce the same assembly

+2

生成されたアセンブリを表示したり、ベンチマークを行ったりすることは、パフォーマンスに関して実際に気にするなら、良いスタートです。 = INT符号長 'の観点 – chris

+2

(?N%2 -1:1);' 'int型A =(N%2 == 0 1:-1?)よりも良好である。私表示' –

+5

A)これがボトルネックであることを示すベンチマークB)コンパイラがそれらを同じものに最適化しなかったことを示すアセンブリを表示してください – Borgleader

答えて

5

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

int g(int n) { 
    return n & 1 ? -1 : 1; 
} 

アセンブリ:関数と同じです

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 

:4.4.7 5.3へ

int h(int n) { 
    return -(n & 1) | 1; 
} 

興味深いことに、GCCコンパイラは長いアセンブリにコンパイルし、これらのバージョンでも同じです。

関連する問題