Javascript 如何将整数更改为2字节

Javascript 如何将整数更改为2字节,javascript,algorithm,Javascript,Algorithm,我有一个算法问题需要解决。但我花了一天时间才真正理解这个问题 问题:对于这个任务,您需要编写一个包含 一对可以 使用编码函数将整数转换为特殊的文本编码 此函数需要接受14位范围内的有符号整数 [-8192..+8191]并返回一个4个字符的字符串 编码过程如下: 1.将8192添加到原始值,使其范围转换为[0..16383] 2.将该值打包为两个字节,以便清除每个字节的最高有效位 未编码中间值(作为16位整数): 00hhhhhlllll 编码值: 0hhhhh0lllll 第1页,共3页 将两

我有一个算法问题需要解决。但我花了一天时间才真正理解这个问题

问题:对于这个任务,您需要编写一个包含 一对可以

使用编码函数将整数转换为特殊的文本编码

此函数需要接受14位范围内的有符号整数 [-8192..+8191]并返回一个4个字符的字符串

编码过程如下:

1.将8192添加到原始值,使其范围转换为[0..16383] 2.将该值打包为两个字节,以便清除每个字节的最高有效位

未编码中间值(作为16位整数):

00hhhhhlllll

编码值:

0hhhhh0lllll

第1页,共3页

将两个字节格式化为单个4字符的十六进制字符串,然后 归还它。样本值:

未编码(十进制)|中间(十进制)|中间(十六进制)| 编码(十六进制)

0 | 8192 | 2000 | 4000

-8192 | 0 | 0000 | 0000

8191 | 16383 | 3fff | 7F7F

2048 | 10240 | 2800 | 5000

-4096 | 4096 | 1000 | 2000

“2.将该值打包为两个字节,以便清除每个字节的最高有效位”部分现在是我的障碍

我应该如何处理这个指令? 事先非常感谢你

我试图通过下面的代码将数字转换为16位。但我不知道下一步该怎么办

let rawInput = parseInt(document.getElementById("inputValue").value);
let interDec= Number.parseInt(rawInput) + 8192
let interHex = interDec.toString(16)
试试看,
+('0b'+binString)
将二进制字符串解析为js编号(
toString
slice
padStart
都是标准的js函数)

函数转换(num){
设b=(num+8192).toString(2).padStart(14,'0');
设L=(+('0b'+b.slice(7)).toString(16).padStart(2,'0');
设H=(+('0b'+b.slice(0,7)).toString(16).padStart(2,'0');
返回H+L;
}
log('0=>',convert(0));
log('-8192=>',convert(-8192));
log('8191=>',convert(8191));
log('2048=>',convert(2048));

log('-4096=>',convert(-4096))当您将8192添加到整数中时,您有一个类值(二进制表示)
00hhhhhlllll

1) 您必须保留正确的(
L
)位-只需使用位掩码
0x7f
((二进制
00000000 01111111
)将它们按位分隔即可

2) 将所有值向左移位,得到
0hhhhhhhhlllllll0
,现在
H
位保留在最后的位置

3) 用位和掩码将
H
位分开
0x7f00
(二进制
01111100000000

4) 将低位和高位部件与二进制或二进制组合在一起

Python示例

v = 0x3fff
ev = (v & 0x7f) | ((v<<1) & 0x7f00)
print(hex(ev))

>>>0x7f7f
v=0x3fff
ev=(v&0x7f)|((v>0x7f7f

谢谢你的回答。虽然我使用Javascript,但你给了我一个很棒的建议,即按位和掩码。我会研究它。这会丢失信息。如果你将8192添加到8191,最终得到16383。在二进制中,这是
01111111111111
。左移,这将为你提供
1111111111110
。如果你然后使用
0x7f00e> ,您将丢失高位。您的方法将丢失信息。@Jim Mischel您不正确-
16383=0x3FFF=00111111 11111111
最佳答案。将其转换为JS非常简单。将
print(hex(ev))
替换为
console.log(ev.toString(16))
et viola.并将
const
添加到var声明中,以避免全局性的最佳实践。非常感谢!你救了我一天!我想再问你一件事。在这一部分(+('0b'+b.slice(7))),在“0b”之前的“+”起什么作用?我能理解“0b”表示数据是二进制的,+符号改变了数字,但我不能理解它。@ShinCat这第二个
+
(在
'0b'
之后)是字符串串联,
b.slice(7)
是带位的字符串,例如“110101”所以
“0b”+b.slice(7))
给出字符串
“0b110101”
-这个字符串可以通过第一个
+
操作符:
+(“0b110101”)
以二进制形式转换为js数字。如果这有帮助,请不要忘记,通过单击大灰色“检查”按钮的左侧接受这个答案(您也可以通过单击灰色上三角来进行投票)您确定这会为该范围内的所有值生成唯一的结果吗?在我看来,当有15个有效位的信息时,您仅使用14位就丢失了信息。@JimMischel在操作问题中有一句话:此函数需要接受14位范围内的有符号整数[-8192..+8191]…(JS:
(8191+8192).toString(2)
=>11111111-14位)-所以您可能是对的-但是解决方案满足OP要求,Kamil Kiełczewski 感谢您的友好回答。让我澄清一下first+。所以+是Javascript中以二进制形式处理数字的方法。我说的对吗?