![]() |
1
4
编辑:多亏了这些评论,我发现我误解了这个问题。(以下为固定版本)。 使用查阅表格:
并使用它对两个字节执行异或运算:
我相信这是尽可能快的,它只是一个XOR操作和一个数组查找(您也可以将其更改为2个数组查找,但它将使用256倍以上的内存,可能会更慢,按位计算,它真的很快)。 |
![]() |
2
6
基本上,从每个数的右边去掉一点,直到两个数相等。当它们相等时,它们的位也相等。 通过引入另一个变量,您可以轻松跟踪前缀的长度。我把那个留给你。 如果您希望它很快,并且考虑到您处理的是字节,为什么不预先计算值并在单个操作中返回答案呢?对两个字节的所有可能的组合运行此算法,并将结果存储在表中。
你只有
编辑:
您得到的解决方案至少对预计算更好,一般来说可能更快:在
|
![]() |
3
3
首先使用xor运算符获取字节之间的二进制差异。然后将位右移,直到差为零:
这将在循环中为您提供最少的计算,因此它将相当快。 |
![]() |
4
2
通过已知的快速解决方案,可以将其重述为一个更简单的问题:
一些代码(显然代码不能立即跟随项目符号列表???)
这只需要6次迭代就可以找到64位长的公共前缀,字节版本只需要3次迭代。展开循环以获得更高的速度。 |
![]() |
5
2
如果您所处的环境空间有限(显然,如果您使用的是C,但一般情况下不是这样),并且无法提供查阅表格:
这基本上是一个未分解的循环,用于查找xor'd数中的第一个1位。我认为没有查阅表格,它不会比这个更快。 |
![]() |
6
1
使用exclusive or(xor)的另一种方法:
|
![]() |
7
1
这是一个程序化的方法:
下面是一种使用只有256个条目的查阅表格的方法:
为了好玩,这里有一种方法可以和Linq一起完成:
|
![]() |
8
1
这里有一个没有表或循环的:
说明:日志 二 x是数字2必须提升到的幂,才能获得值x。由于二进制数字中的每个位代表2的下一个幂,因此可以使用此事实来查找最高的位集(从0开始计数):
所以代码是通过
|
![]() |
9
0
|
![]() |
10
0
256字节的表版本似乎相当不错;根据缓存和分支问题,16字节的表版本可能运行得更快,也可能不会运行得更快。类似: /* Assumes table[16] is defined similarly to the table[256] in earlier examples */ unsigned int find_mismatch(unsigned char a, unsigned char b) { unsigned char mismatch; mismatch = a^b; if (mismatch & 0xF0) return table[mismatch >> 4]; else return table[mismatch]+4; } 更多的指令,包括一个分支,但是由于表现在只有16个字节,所以只需要一个或两个缓存未命中就可以完全填充。另一种方法,在一个16字节的表和一个5字节的表上使用总共三个查找,但不进行分支: unsigned char table2[5] = {0,0,0,0,0xFF}; unsigned int find_mismatch(unsigned char a, unsigned char b) { unsigned char mismatch,temp2; mismatch = a^b; temp2 = table[mismatch >> 4]; return temp2 + (table2[temp2] & table[mismatch & 15]); } 我们必须在实际应用程序中进行一些分析,以查看减少的较小表的缓存负载是否足以抵消额外的指令。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |