を計算する必要があります((2^128) - 1) / x
。除数x
は、符号なしの 64 ビット数です。被除数は 2 つの符号なし 64 ビット数値 (上位と下位) で構成され、両方の数値はUINT64_MAX
. 私は64ビットの算術演算しか使用できず、移植可能である必要があります(GNU __int128
、MSCV _udiv128
、アセンブリ、またはそのようなものは使用しません)。商の上位部分は必要ありません。下位 64 ビットのみが必要です。
この操作を行うにはどうすればよいですか?
またx >= 3
、x
は 2 の累乗ではありません。
編集:独自のソリューションを作成しました(以下の回答)。しかし、より良いパフォーマンスを発揮する他のソリューションを歓迎します:)