有没有一个快速算法,类似于2的幂,可以与3一起使用,即n%3。也许是这样的,如果数字之和可以被3整除,那么数字也可以被整除。这就引出了下一个问题。在数字中添加数字的快速方法是什么?i、 e.37->3+7->10我正在寻找一些没有条件的东西,因为那些倾向于抑制矢量化谢谢
gz5pxeao1#
这个comp.compilers项目对计算模3有一个特别的建议。另一种方法,特别是如果被除数的最大值是适度的,是乘以3的倒数作为一个定点值,有足够的精度处理最大值的被除数来计算商,然后从被除数中减去3*商得到余数。所有这些乘法都可以通过固定的移位和加法序列来实现。指令的数量将取决于倒数的位模式。当股息最大值的大小适中时,这种方法非常有效。关于在数字中添加数字。。。如果你想加上十进制数字,你要做的就是将数字转换成十进制,这包括在某处除以10。如果您愿意满足于将base2中的数字相加,可以通过简单的右移和加法循环来实现。可以使用各种巧妙的技巧,以n位为单位来进一步加快速度。
ecfsfe2w2#
不确定你的第一个问题,但对于你的第二个问题,你可以利用 % 运算符和整数除法:
%
int num = 12345; int sum = 0; while (num) { sum += num % 10; num /= 10; }
这是因为 12345 % 10 = 5 , 12345 / 10 = 1234 一直走到 num == 0
12345 % 10 = 5
12345 / 10 = 1234
num == 0
yqlxgs2m3#
4 % 3 == 1 ,所以 (4^k * a + b) % 3 == (a + b) % 3 . 您可以使用此事实来计算32位x的x%3:
4 % 3 == 1
(4^k * a + b) % 3 == (a + b) % 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更快?如果是的话,那可能就不多了。
3条答案
按热度按时间gz5pxeao1#
这个comp.compilers项目对计算模3有一个特别的建议。
另一种方法,特别是如果被除数的最大值是适度的,是乘以3的倒数作为一个定点值,有足够的精度处理最大值的被除数来计算商,然后从被除数中减去3*商得到余数。所有这些乘法都可以通过固定的移位和加法序列来实现。指令的数量将取决于倒数的位模式。当股息最大值的大小适中时,这种方法非常有效。
关于在数字中添加数字。。。如果你想加上十进制数字,你要做的就是将数字转换成十进制,这包括在某处除以10。如果您愿意满足于将base2中的数字相加,可以通过简单的右移和加法循环来实现。可以使用各种巧妙的技巧,以n位为单位来进一步加快速度。
ecfsfe2w2#
不确定你的第一个问题,但对于你的第二个问题,你可以利用
%
运算符和整数除法:这是因为
12345 % 10 = 5
,12345 / 10 = 1234
一直走到num == 0
yqlxgs2m3#
4 % 3 == 1
,所以(4^k * a + b) % 3 == (a + b) % 3
. 您可以使用此事实来计算32位x的x%3:(未经测试-您可能需要更多的减少。)这是否比您的硬件可以做x%3更快?如果是的话,那可能就不多了。