4

16 で割り切れる最も近い、小さくない数を取得する最善の方法は何ですか?

私が思いついた方法は、あまりエレガントでも速くもありません

int non_smaller_int_divisible_by_16(int x)
{
  return x + ((16 - (x % 16)) % 16);
}

期待される結果は

result | X values
-------|----------
16     | 1,2,..., 16
32     | 17, 18, ... 32
48     | 33, 34, ..., 48

4

4 に答える 4

11
int non_smaller_int_divisible_by_16(int x)
{
  return (x + 15) & ~15;
}

16 は 2 のべき乗であるため、バイナリ マスキングを使用できます。15 を加算して次に高い倍数を取得し、15 のビットごとの逆数でマスクして、下位ビットをクリアします。

編集:

負の数で何をしたいのか明確ではありません - あなたと私のコードの両方がより正の値に丸められます (つまり、負の数は小さくなります)。プログラムで負の値が意味をなさない場合は、符号なしの型を使用することをお勧めします。

最後に、Bit Twiddling Hacksをご覧になることをお勧めします。これは、これらの線に沿った非常に巧妙な (多くの場合非常にあいまいな) トリックの素晴らしいコレクションです。

于 2011-06-05T16:02:52.900 に答える
5

@therefromhere のソリューションはよりエレガントで高速ですが、2 の累乗ではない数値でこれを行う必要がある場合は、このアプローチを使用できます。

int non_smaller_int_divisible_by_n(int x, int n)
{
  return n*((x+n-1)/n);
}
于 2011-06-05T16:04:32.140 に答える
1

@nemo のコメントに続いて、これを解決する気の利いた方法があります。これは、すべての mod ベースで機能し、非常に読みやすく、高速である必要があります。

unsigned int non_smaller_int_divisible_by_16(unsigned int x)
{
   return x + ((-x) % 16);
}

したがって、ジェネリックバージョンは

unsigned int non_smaller_int_divisible_by_base(unsigned int x, unsigned int base)
{
   return x + ((-x) % base);
}
于 2011-06-06T10:05:38.890 に答える
-1
int non_smaller_int_divisible_by_16(int x) {
    return (x & 15) ? (x | 15) + 1 : x;
}
于 2011-06-05T16:10:20.537 に答える