-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で
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で
:
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コンパイラは長いアセンブリにコンパイルし、これらのバージョンでも同じです。
生成されたアセンブリを表示したり、ベンチマークを行ったりすることは、パフォーマンスに関して実際に気にするなら、良いスタートです。 = INT符号長 'の観点 – chris
(?N%2 -1:1);' 'int型A =(N%2 == 0 1:-1?)よりも良好である。私表示' –
A)これがボトルネックであることを示すベンチマークB)コンパイラがそれらを同じものに最適化しなかったことを示すアセンブリを表示してください – Borgleader