这是一个奇怪的,但在这里坚持我。给定十六进制值(从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方法来实现这一点。
谢谢!
答案 0 :(得分:4)
请注意,正如我在上面的评论中提到的,您不需要将值转换为字符串;如果将其保留为十进制整数,则可以使用bitshift和remainder运算符来获取二进制值。
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;
}, {});
答案 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;
});