2

を計算する必要があります((2^128) - 1) / x。除数xは、符号なしの 64 ビット数です。被除数は 2 つの符号なし 64 ビット数値 (上位と下位) で構成され、両方の数値はUINT64_MAX. 私は64ビットの算術演算しか使用できず、移植可能である必要があります(GNU __int128、MSCV _udiv128、アセンブリ、またはそのようなものは使用しません)。商の上位部分は必要ありません。下位 64 ビットのみが必要です。

この操作を行うにはどうすればよいですか?

またx >= 3xは 2 の累乗ではありません。

編集:独自のソリューションを作成しました(以下の回答)。しかし、より良いパフォーマンスを発揮する他のソリューションを歓迎します:)

4

2 に答える 2