/*
* 2的次方运算
*/
for (let i = 0; i < 16; i++) {
// console.log(1 << i) // 或 2 ** i //1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
// console.log(Math.pow(2, i)) //1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
}
/*
* 根据次方结果, 得出计算次方的次数,即数组的index;index+1则为对象选项的option值
*/
const values = [
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
];
const exponents = values.map(v => Math.log2(v));
// → [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
console.log('Math.log for values:', exponents);
console.log('Math.log1:', Math.log2(1)); //0
console.log('Math.log2:', Math.log2(2)); //1
// 生成选项值, num传入值 > =1
const valuesOPT = (num = 1) => {
if (typeof num !== 'number') {
return [];
}
const resultArr = [];
for (let i = 0; i < num; i++) {
resultArr.push(Math.pow(2, i));
}
return resultArr;
};
const answerOriginal = valuesOPT(NaN); // [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384] // 选项值
const res = answerOriginal.slice(0, 3);
console.log('answerOriginal:', answerOriginal); // [1]
console.log('res:', res); // [1]
const powers = [
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
];
/**
* 根据总和来计算是哪些2的次方数相加得到的
* 例如:1025 = 1 + 1024
*/
const totalSum = 1025;
const result = powers.filter(p => (totalSum & p) === p);
console.log('result:', result); //[1, 1024]
const secondParty = Math.ceil(Math.log2(totalSum) + 1);
console.log('secondParty:', secondParty); // 12
const displayResult = valuesOPT(secondParty).filter(v => (totalSum & v) === v);
console.log('displayResult:', displayResult);
function findSumCombination(arr, target) {
const nums = arr?.map(_c => +_c) ?? [];
let dp = new Map();
dp.set(0, []);
for (let num of nums) {
let newDp = new Map(dp);
for (let [sum, combination] of dp) {
let newSum = sum + num;
let newCombination = [...combination, num];
if (newSum <= target && !newDp.has(newSum)) {
newDp.set(newSum, newCombination);
}
}
dp = newDp;
}
return dp.get(parseFloat(target)) || null;
}
const result2 = findSumCombination(powers, 50176);
console.log('result2:', result2); // [1, 1024]