是否有可能得到作为2的幂的结果形成值的整数?
Example:
129 resolves [1, 128]
77 resolves [1, 4, 8, 64]
我已经考虑过使用Math.log并使用按位比较器做一个foreach。还有其他更漂亮的解决方案吗?
答案 0 :(得分:1)
最简单的方法是使用单个位值,从1开始并将该位“左”移位,直到其值大于要检查的值,将每个位步骤与值进行比较。设置的位可以存储在数组中。
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);
答案 2 :(得分: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));