我有一个使用按位枚举的对象。我也有一个与此对象对应的整数。该对象可能看起来像这样:
resultTemplate
因为8 + 4 + 2 = 14,所以我想编写一个应返回key3,key4和key5的函数。这可能在Javascript中吗?如果是这样,怎么做?如果不是,该怎么办?
答案 0 :(得分:1)
恕我直言,您正在尝试执行以下操作:
let enumLike = Object.freeze({
key1: 0, key2: 1, key3: 2, key4: 4, key5: 8, key6: 16, key7: 32, key8: 64
})
let myInt = 14;
function enumerator(integer) {
let output = [];
while (integer > 0) {
Object.keys(enumLike).reverse().forEach(k => {
if (enumLike[k] <= integer) {
integer -= enumLike[k];
output.push(k);
}
})
}
return output;
}
console.log(enumerator(myInt));
更好的方法:
function bitwiseEnumerator(input) {
return input.toString(2).split('').reverse().reduce((a, current, index) => {
if (current != 0 ) a.push('key' + index);
return a;
}, []);
}
console.log(bitwiseEnumerator(15));
console.log(bitwiseEnumerator(14));
console.log(bitwiseEnumerator(12));
console.log(bitwiseEnumerator(16));
注意:key0
= 1,key1
= 2,key2
= 4,key3
= 8,key4
= 16,依此类推。 (在此示例中)
答案 1 :(得分:0)
您可以按位进行运算,然后向左移动一个,直到该值大于给定值。
代替使用对象,您只需生成密钥即可。
var value = 14,
i = 0;
while (1 << i < value) {
if (value & 1 << i) {
console.log(i, 1 << i, 'key' + (i + 1));
}
i++;
}