我有一个巨大的“二进制”字符串,例如: 1110 0010 1000 1111 0000 1100 1010 0111 ....
它的长度为0模4,可能达到500,000。
我还有一个相应的数组:{ 14 ,2, 8 ,15, 0 ,12, 10 ,7,...}
(数组中的每个数字对应于字符串中的4位)
鉴于此字符串,此数组和数字N
,我需要计算以下子字符串string.substr(4*N, 4)
,即:
N=0
,结果应为1110
N=1
,结果应为0010
我需要多次执行此任务,我的问题是计算此子字符串的最快方法是什么?
一种方法是直接计算子字符串:string.substr(4*N, 4)
。我担心这个巨大的字符串效率不高。
另一种方法是使用array[N].toString(2)
,然后根据需要用零包装结果。我不确定这有多快。
你可能还有其他想法吗?
答案 0 :(得分:2)
字符串来自哪里?为什么不将字符串表示为二进制,而不是十六进制,然后您可以将每个四位二进制数部分存储为单个字符? (如果你想要的话,显然可以将它打包两倍,或者实际上现在我想到它,4次,因为Javascript字符串是16位Unicode)。然后查找单个组将是对“charAt()”的单个调用,您只需通过查找表扩展为二进制形式。
编辑 - 哦,嗯,你已经有了一个数组。在这种情况下,根本不做子串工作;这很疯狂。只需抓住数组元素并将其通过查找数组转换为4位二进制数字字符串。
答案 1 :(得分:1)
您可以考虑将您的大字符串表示为Rope数据结构。绳索基本上是一个二叉树,其叶子是字符数组。树中的节点具有左子节点和右子节点,左子节点是字符串的第一部分,而右子节点是最后一部分。
通过使用绳索,子串操作在复杂性方面变为对数,而不是线性的,因为它们是常规字符串。
答案 2 :(得分:1)
如果你想填充它,你可以这样做:
var elem = array[N]
var str = "" + ((elem>>3)&1) + ((elem>>2)&1) + ((elem>>1)&1) + (elem&1);
答案 3 :(得分:1)
阵列已经完全符合您的需要,不是这样,除非您需要以二进制格式打印它。幸运的是,sprintf
for javascript可用。