【问题标题】:How to round to nearest doubling factor of 32?如何四舍五入到最接近的倍数 32?
【发布时间】:2021-04-08 00:34:26
【问题描述】:

我有一堆大小翻倍的垃圾箱,从 32 号开始。这些垃圾箱被分成两半并添加到较低的垃圾箱中,但这对于这个问题并不重要。我目前正在硬编码一个“max”16777216,它是最大 bin 的大小。

let bins = [
  [], // 1 = 32
  [], // 2 = 64
  [], // 3 = 128
  [], // 4 = 256
  [], // 5 = 512
  [], // 6 = 1024
  [], // 7 = 2048
  [], // 8 = 4096
  [], // 9 = 8192
  [], // 10 = 16384
  [], // 11 = 32768
  [], // 12 = 65536
  [], // 13 = 131072
  [], // 14 = 262144
  [], // 15 = 524288
  [], // 16 = 1048576
  [], // 17 = 2097152
  [], // 18 = 4194304
  [], // 19 = 8388608
  [0], // 20 = 16777216

我想根据平台上的可用内存动态确定 bin 的数量,作为 32 的因子。因此,如果机器上有 24 TB 的可用内存,即 1.92e+14 位,或者6e+12 个 32 位块。因此,我会按照与数字增长方式相同的模式,将该数字四舍五入到最接近的 32 的倍数倍数。

如何使用通用方程以编程方式执行此操作?我通过手动收集这些数字:

a = 1 * 32
b = a * 2
c = b * 2
d = c * 2
...
  1. 如何使用泛型方程做到这一点?
  2. 如何有效地四舍五入到最接近的数字?

【问题讨论】:

  • No (i * 32) + (i * 32 * (2 * (i - 1)))i == 19 给出不在列表中的 22496。
  • 我认为是 2**(4+i),其中 ** 我的意思是 power of
  • 这似乎很合适:32 * (2^(i-1)) where ^ = power of

标签: javascript math binary


【解决方案1】:
const smallestBin = n => {
  if(n <= 32) return 32;
  let size = 5;
  for(let x = Math.trunc(n/32); x > 0; x = Math.trunc(x/2), size++) { }
  size = 2**size;
  return size == n*2 ? n : size;
};

请注意,我们不使用按位运算符,因为它们仅限于 32 位。

【讨论】:

    【解决方案2】:

    当您说32 * 2 * 2 * 2... 时,您是在将 32 乘以 2 的某个幂,或者基本上是:

    32 * 2^i
    

    现在,因为在您的示例中 i 从 1 开始。正确的等式实际上是:

    16 * 2^i
    

    因为 16 也是 2 的幂,所以你可以这样写:

    2^4 * 2^i
    

    等于:

    2^(4+i)
    

    如果你现在有一个随机数,你如何将它四舍五入到最接近的 2 次幂?这基本上是计算数字的对数(以 2 为底),然后将结果四舍五入到下一个整数。 该整数值是最接近的 2 次幂的指数(向上舍入)。

    如果你想要最接近的 2 的幂,这只是:2^result。所以完整的方程是:

    2^round(log_2(num))
    

    在 javascript 中,您可以这样做:

    2**Math.ceil(Math.log2(num))
    

    如果您需要索引 i,请记住您的数字是 2^(4+i),因此只需从 round(log_2(num)) 中减去 4,即可得到 i

    【讨论】:

    • 哈哈我就知道这很简单!那么,我只需要四舍五入到最接近的 2 次方?
    • 我不确定你的意思。所有这些数字都已经是 2 的幂
    • 我的意思是,考虑到我有一些任意数字(平台的最大内存大小),我如何通过四舍五入找到正确的 bin。
    • 我编辑了答案以纠正一个小错误。我希望它也能回答你的最后一个问题
    • 抱歉,不得不进行大量编辑...我不确定您是否想要最接近的 2 的幂,或者您是否想要数组的索引。在答案中应该解释如何获得两者
    猜你喜欢
    • 2011-03-25
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2011-03-16
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多