计算 4 进制匹配数字的最快方法是什么?
给定两个无符号整数,计算其以 4 为基数的表示形式中匹配数字的数量的最快方法是什么?
示例 1:
A= 13 = (31)(基数为 4)
B= 15 =(33)(基数为 4)
基数为 4 的匹配位数为 1。
示例 2:
A= 163 =(2203)(基数为 4)
B= 131 = (2003) 以 4 为基数,
以 4 为基数的匹配位数为 3。
我猜第一步是计算两个整数的按位异或,那么我们必须数一下 00 对的数量?最有效的方法是什么?
注意:假设 A 和 B 以 4 为基数具有固定的位数,即 16 位数字。
Given two unsigned integers, what is the fastest way to count the number of matching digits in their base 4 representation?
example 1:
A= 13 = (31) in base 4
B= 15 = (33) in base 4
the number of matching digits in base 4 is 1.
example 2:
A= 163 = (2203) in base 4
B= 131 = (2003) in base 4
the number of matching digits in base 4 is 3.
The first step I guess is to calculate the bitwise XOR of the two integers, then we have to count number of 00 pairs ? what is the most efficient way t do that ?
note: assume that A and B have fixed number of digits in base 4, say exactly 16 digits.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设您的 int 每个都是 4 字节。 32 位。
更容易理解的方式:
帮助常量数组:
稍后,为了检查,如果
c
是按位异或后的整数:其他解决方案。显然,更快,但有点难以理解:
进一步加速:
更进一步:
如果你真的需要使用该函数很多次(10^10)次,计算 h[256] (你已经抓住了,如何),然后使用:
我认为,帮助数组 h[256*256] 也可以使用。然后
2^16 整数的数组将全部在处理器现金中(尽管是第三级)。所以,速度会非常快。
Suppose, your ints are 4-byte each. 32 bits.
The more understandable way:
Help constant array:
Later, for the check, if
c
is the integer after bitwise XOR :Other solution. Obviously, faster, but a bit less understandable:
Further qickening:
Even further:
If you really need use the function so many (10^10) times, count h[256] (you already caught, how), and use:
I think, the help array h[256*256] would be also usable yet. Then
The array of 2^16 ints will be all in the processor cash (third level, though). So, the speed will be really great.
一种解决方案是使用 Oli 建议的设置位数计数算法。但要使其适应基数 4,我们可以这样做:
d = x^y;
d=(d|(d>>1))& 1431655765; //1431655765=(01010101010101010101010101010101) 以 2 为基数
,然后计算 d 中设置的位数。这给出了不匹配的数量。
这是最有效的方法吗?
One solution is to use the set bits count algorithms as suggested by Oli. but to adapt it to base 4, we can do for example:
d = x^y;
d = (d | (d>>1))& 1431655765; //1431655765=(01010101010101010101010101010101) in base 2
then count the number of set bits in d. this gives the number of mismatches.
Is this the most efficient way though ?