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

ETC

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 回答