Javascript中的按位枚举给定一个整数



我有一个使用按位枚举的对象。我还有一个对应于这个对象的整数。对象可能如下所示:

let int = 14; // key3 + key4 + key5
let enum {
key1: 0,
key2: 1,
key3: 2,
key4: 4,
key5: 8,
key6: 16,
key7: 32,
key8: 64
// .....
}
// Output: ['key3', 'key4', 'key5'] or something along the lines of this

因为 8 + 4 + 2 = 14,我想编写一个应该返回 key3、key4 和 key5 的函数。这在Javascript中可能吗?如果是这样,它是如何完成的?如果不是,怎么能做到?

恕我直言,您正在尝试执行以下操作:

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,依此类推。(在此示例中(

您可以采用按位运算并将一个运算向左移动,直到此值大于给定值。

您可以只生成键,而不是使用对象。

var value = 14,
i = 0;
while (1 << i < value) {
if (value & 1 << i) {
console.log(i, 1 << i, 'key' + (i + 1));
}
i++;
}

最新更新