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