将十六进制值转换为布尔值列表

时间:2016-05-31 22:11:48

标签: javascript

这是一个奇怪的,但在这里坚持我。给定十六进制值(从00-FF),我需要将其转换为二进制,然后从那里将其转换为一个对象,其中键是每个位的“位置”,值是布尔值。

这是一个尴尬的解释。这是一个例子:

鉴于'FF',我需要将其翻译成二进制文件(parseInt(<hex value>, 16).toString(2)适用于该作业)。

现在FF已成为1111 1111,我需要将其转换为一个看起来像这样的对象:

{ 
  "1": true, 
  "2": true, 
  "4": true, 
  "8": true, 
  "16":true, 
  "32":true,
  "64": true, 
  "128": true
}

作为另一个例子,给定十六进制值'A6',它将成为1010 0110

{ 
  "1": false, 
  "2": true, 
  "4": true, 
  "8": false, 
  "16":false, 
  "32":true, 
  "64": false, 
  "128": true
}

我唯一要做的就是从二进制转换 - >宾语。

我知道我可以用一个简单的循环来完成它,但我想知道是否有任何很酷的comp-sci方法来实现这一点。

谢谢!

4 个答案:

答案 0 :(得分:4)

请注意,正如我在上面的评论中提到的,您不需要将值转换为字符串;如果将其保留为十进制整数,则可以使用bitshiftremainder运算符来获取二进制值。

var x = parseInt('A6', 16); // 166
var result = {};

for (var n = 1; x > 0; x = x >> 1, n = n * 2) {
   result[n] = x % 2 == 1;
}

console.log(JSON.stringify(result, undefined, 2));

答案 1 :(得分:1)

您可以在不使用中间二进制字符串的情况下执行此操作,但如果您只是坚持最后一步,则可以执行以下操作:

var bin = parseInt('0xa6', 16).toString(2);

Array.from(bin).reduce(function(byte, bit, index) {
    byte[1 << bin.length - index - 1] = bit === '1';
    return byte;
}, {});

JavaScript demo

答案 2 :(得分:0)

这是一个班轮

const x = parseInt('A6', 16).toString(2).split('').reduceRight((last, bit, i, arr) => Object.assign(last, {[`${1 << (arr.length - i - 1)}`]: bit == 1}), {})
console.log(x)

假设您所处的环境支持Java documentation(可在ES2015中使用)

答案 3 :(得分:-1)

在这里。

var x = {}, s = 1;
(0x10100110).toString(16).split('').reverse().map(a => {
    x[s] = !!~~a;
    s *= 2;
});