快速模3或除法算法?

ee7vknir  于 2021-06-26  发布在  Java
关注(0)|答案(3)|浏览(660)

有没有一个快速算法,类似于2的幂,可以与3一起使用,即n%3。也许是这样的,如果数字之和可以被3整除,那么数字也可以被整除。
这就引出了下一个问题。在数字中添加数字的快速方法是什么?i、 e.37->3+7->10我正在寻找一些没有条件的东西,因为那些倾向于抑制矢量化
谢谢

gz5pxeao

gz5pxeao1#

这个comp.compilers项目对计算模3有一个特别的建议。
另一种方法,特别是如果被除数的最大值是适度的,是乘以3的倒数作为一个定点值,有足够的精度处理最大值的被除数来计算商,然后从被除数中减去3*商得到余数。所有这些乘法都可以通过固定的移位和加法序列来实现。指令的数量将取决于倒数的位模式。当股息最大值的大小适中时,这种方法非常有效。
关于在数字中添加数字。。。如果你想加上十进制数字,你要做的就是将数字转换成十进制,这包括在某处除以10。如果您愿意满足于将base2中的数字相加,可以通过简单的右移和加法循环来实现。可以使用各种巧妙的技巧,以n位为单位来进一步加快速度。

ecfsfe2w

ecfsfe2w2#

不确定你的第一个问题,但对于你的第二个问题,你可以利用 % 运算符和整数除法:

int num = 12345;
int sum = 0;
while (num) {
    sum += num % 10;
    num /= 10;
}

这是因为 12345 % 10 = 5 , 12345 / 10 = 1234 一直走到 num == 0

yqlxgs2m

yqlxgs2m3#

4 % 3 == 1 ,所以 (4^k * a + b) % 3 == (a + b) % 3 . 您可以使用此事实来计算32位x的x%3:

x = (x >> 16) + (x & 0xffff);
x = (x >> 10) + (x & 0x3ff);
x = (x >> 6) + (x & 0x3f);
x = (x >> 4) + (x & 0xf);
x = (x >> 2) + (x & 0x3);
x = (x >> 2) + (x & 0x3);
x = (x >> 2) + (x & 0x3);
if (x == 3) x = 0;

(未经测试-您可能需要更多的减少。)这是否比您的硬件可以做x%3更快?如果是的话,那可能就不多了。

相关问题