计算 4 进制匹配数字的最快方法是什么?

发布于 2025-01-04 07:16:01 字数 338 浏览 1 评论 0原文

给定两个无符号整数,计算其以 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

相权↑美人 2025-01-11 07:16:01

假设您的 int 每个都是 4 字节。 32 位。

更容易理解的方式:
帮助常量数组:

h[0]=3;
for (int i=1; i<7; i++){
  h[i]=h[i-1]*4;
}

稍后,为了检查,如果c是按位异或后的整数:

int count=0;
for (int i=0; i<7; i++){
  if(c&h[i]==0)count++;
}   

其他解决方案。显然,更快,但有点难以理解:

int h[4]={1,0,0,0}

int count=0;
for (int i=0; i<15; i++){
  count+=h[c&3];
  c=c>>2;
}   

进一步加速:

count= h[c&3] + h[(c=>>2)&3] + h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c>>2)&3];

更进一步:

int h[16]={2,1,1,1, 1,0,0,0, 1,0,0,0, 1,0,0,0};
count= h[c&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15]  + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15]+ h[(c>>4)&15];

如果你真的需要使用该函数很多次(10^10)次,计算 h[256] (你已经抓住了,如何),然后使用:

count= h[c&255] + h[(c=>>8)&255] + h[(c=>>8)&255] + h[(c>>8)&255] ;

我认为,帮助数组 h[256*256] 也可以使用。然后

count= h[c&255] + h[(c>>16)&(256*256-1)];

2^16 整数的数组将全部在处理器现金中(尽管是第三级)。所以,速度会非常快。

Suppose, your ints are 4-byte each. 32 bits.

The more understandable way:
Help constant array:

h[0]=3;
for (int i=1; i<7; i++){
  h[i]=h[i-1]*4;
}

Later, for the check, if c is the integer after bitwise XOR :

int count=0;
for (int i=0; i<7; i++){
  if(c&h[i]==0)count++;
}   

Other solution. Obviously, faster, but a bit less understandable:

int h[4]={1,0,0,0}

int count=0;
for (int i=0; i<15; i++){
  count+=h[c&3];
  c=c>>2;
}   

Further qickening:

count= h[c&3] + h[(c=>>2)&3] + h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c>>2)&3];

Even further:

int h[16]={2,1,1,1, 1,0,0,0, 1,0,0,0, 1,0,0,0};
count= h[c&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15]  + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15]+ h[(c>>4)&15];

If you really need use the function so many (10^10) times, count h[256] (you already caught, how), and use:

count= h[c&255] + h[(c=>>8)&255] + h[(c=>>8)&255] + h[(c>>8)&255] ;

I think, the help array h[256*256] would be also usable yet. Then

count= h[c&255] + h[(c>>16)&(256*256-1)];

The array of 2^16 ints will be all in the processor cash (third level, though). So, the speed will be really great.

虐人心 2025-01-11 07:16:01

一种解决方案是使用 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 ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文