私は整数の補数整数を出力するように求めるleetCode質問を書いています。 LeetCode#476ビット演算が文字列演算よりも遅い理由LeetCode#476
私はいつもビット操作が速いと考えました。最後はビット操作ですべてが行われるからです。しかし、この問題では、文字列メソッドはビット操作よりも高速で、なぜ私は不思議に思っています。
11msで受け付けられる文字列操作コードを書きました。コードは、非常に直感的な、次のとおりです。
class Solution {
public int findComplement(int num) {
String s = Integer.toBinaryString(num);
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()){
sb.append(c == '1' ? 0 : 1);
}
int ret = Integer.parseInt(sb.toString(), 2);
return ret;
}
}
問題を解決するためにビット操作を見つけて試しました。しかし、それは13msで受け入れられました。以下はコードです。
class Solution {
public int findComplement(int num) {
return ~num & ((Integer.highestOneBit(num) << 1) - 1);
}
}
2msのは、(/関連)本当に重要ということでしょうか? –
さて、あなたはビットを操作するだけではありません。パフォーマンスに影響するかどうかは分かりませんが、highestOneBitは減算を行い、減算も行います( '((Integer.highestOneBit(num)<< 1) - 1)それはプロセスを遅くするかもしれませんが(私はわかりません) – BackSlash
[Javaで正しいマイクロベンチマークを書くにはどうすればいいですか?](https://stackoverflow.com/questions/504103/マイクロベンチマーク・イン・ジャック) –