JS实现LFSR生成指定长度十六进制数出现多余末尾0如何解决
问题原因
你遇到的末尾多余0问题来自两个代码缺陷:
- 变量拼写错误:循环判断条件中你把参数
length错写为lenght,会直接导致循环逻辑异常 - JS普通数值精度不足:你生成的100位二进制串远超过JS Number类型的最大安全整数范围(
2^53 - 1),超出部分的位会丢失精度被默认置为0,转十六进制后就会出现大量末尾0
修正方案
用BigInt处理大整数转换避免精度丢失,再用正则去除十六进制末尾的多余0即可,修正后代码如下:
function lfsr(seed, length) { // 种子转二进制数组,用BigInt处理大种子避免提前出现精度问题 var arr = Array.from(BigInt(seed).toString(2)); let result = ""; // 修正拼写错误 for (var i = 0; i < length; i++) { let _last = parseInt(arr.pop()); let _blast = parseInt(arr[arr.length - 1]); let _newbit = _last ^ _blast; arr.splice(0, 0, _newbit.toString()); result += _newbit.toString(); } // 用BigInt转二进制再转十六进制,完全避免精度丢失 let hexStr = BigInt(`0b${result}`).toString(16); // 去除末尾多余的0,全0场景保留1个0避免返回空值 return hexStr.replace(/0+$/, '') || '0'; }
测试调用:
var ans = lfsr(6543123123798,100); console.log(ans);
运行后不会再出现多余的末尾0,输出的十六进制长度和你传入的100位二进制对应的十六进制长度完全匹配。
内容的提问来源于stack exchange,提问作者Gidon Avziz
相关产品推荐
相关产品推荐

