将值分解为2的幂的结果

时间:2015-02-03 12:00:07

标签: javascript math

是否有可能得到作为2的幂的结果形成值的整数?

Example: 
129 resolves [1, 128]
77 resolves [1, 4, 8, 64]

我已经考虑过使用Math.log并使用按位比较器做一个foreach。还有其他更漂亮的解决方案吗?

5 个答案:

答案 0 :(得分:1)

最简单的方法是使用单个位值,从1开始并将该位“左”移位,直到其值大于要检查的值,将每个位步骤与值进行比较。设置的位可以存储在数组中。

Example

function GetBits(value){
  var b = 1;
  var res= [];
  while(b<=value){
    if(b & value)res.push(b);
    b <<= 1;
  }
  return res;
}

由于移位可以看作是2的幂,因此可以将当前位值直接推入结果数组中。

答案 1 :(得分:1)

您可以将其他语言的解决方案调整为javascript。在这个问题中,您将找到一些使用Java解决问题的方法(您可以选择更优雅的方法)。

decomposing a value into powers of two

我根据javascript调整了其中一个答案并提出了这段代码:

var powers = [], power = 0, n = 129;// Gives [1,128] as output.
while (n != 0) {
    if ((n & 1) != 0) {
        powers.push(1 << power);
    }
    ++power;
    n >>>= 1;
}
console.log(powers);

Fiddle

答案 2 :(得分:0)

  1. 找出数字中包含的最大2的幂。
  2. 从原始号码中减去并将其添加到列表中。
  3. 减少指数并检查新2的权力是否小于数字。
  4. 如果小于,则将其从原始数字中减去并将其添加到列表中。
  5. 否则请转到第3步。
  6. 当您的号码变为0时退出。

答案 3 :(得分:0)

我正在考虑创建一个包含2个数字的所有幂的列表&lt; =您的数字,然后使用加减法算法找出正确的数字组。 例如77号: 因子组是{1,2,4,8,16,32,64} [64是2的最大幂小于或等于77]

一种算法,它连续从您刚刚创建的组中减去小于或等于您的数字的最大数字,直到您得到零。

77-64 = 13 ==&gt; [64]

13-8 = 7 ==&gt; [8]

7-4 = 3 ==&gt; [4]

3-2 = 1 ==&gt; [2]

1-1 = 0 ==&gt; [1]

希望你理解我的算法,pardo我的英语不好。

答案 4 :(得分:0)

function getBits(val, factor) {
    factor = factor || 1;
    if(val) {
        return (val % 2 ? [factor] : []).concat(getBits(val>>1, factor*2))
    }
    return [];
}

alert(getBits(77));