big.Int が 0 かどうかをテストする効率的な方法
Go で大きな整数を扱う場合、値をテストすることが重要です効率的に0。従来のアプローチでは、big.Int を 0 を表す別の big.Int と比較します (たとえば、Cmp(zero) == 0 を使用します)。ただし、big.Ints の基になる表現を利用する高速な代替手段があります。
Raw バイトの使用 (バイト アクセス)
big.Int は Int.Bits( ) 関数。整数表現の生のバイトへのアクセスを提供します。これは、基になるデータのコピーを回避できるため、高速な方法です。このバイト スライスの長さをチェックすることで、big.Int が 0 であるかどうかを判断できます。
if len(i1.Bits()) == 0 { // i1 is 0 }
ビット長を使用
あるいは、 Int.BitLen() 関数。big.Int 内の有効ビット数を返します。 0 のビット長は 0 であるため、次のようにゼロをテストできます。
if i1.BitLen() == 0 { // i1 is 0 }
ベンチマーク結果
これらの手法を従来の比較方法と比較してベンチマークすると、重要な結果が明らかになります。パフォーマンスの向上:
低レベル プロパティを使用した 1 のテスト
A big.Int が 1 に等しいかどうかのテストに同様の最適化を適用できます。ただし、0 は固有のプロパティがあるため、この最適化はそれほど重要ではありません。
func isOne(i *big.Int) bool { bits := i.Bits() return len(bits) == 1 && bits[0] == 1 && i.Sign() > 0 }
この手法を従来の比較とベンチマークすると、パフォーマンスが約 10 倍向上することがわかります。
結論
上で概説したメソッドは、big.Int が 0 か 1 かをテストする効率的な方法を提供し、次の低レベルのプロパティを利用します。従来の比較アプローチと比較して表現力が向上し、パフォーマンスが向上します。これらの手法により、特にタイム クリティカルなアプリケーションにおいて、大きな整数を操作するコードの速度を向上させることができます。
以上がGo の「big.Int」がゼロかどうかを効率的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。