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

时间:2018-07-06 16:53:27

标签: javascript

我有一个使用按位枚举的对象。我也有一个与此对象对应的整数。该对象可能看起来像这样:

resultTemplate

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

2 个答案:

答案 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++;
}