没有数学运算符的模数

时间:2013-12-14 17:50:33

标签: ruby algorithm modulus

我想创建一个给出数字n和数字16的方法,并将模数运算符应用于它们(n % 16)。让我难过的是我不需要使用任何数学运算符(+, - ,/,*,%)。

2 个答案:

答案 0 :(得分:4)

由于162^4,您可以通过将值截断为4个最低有效位来获得相同的结果。

所以:

x & 0xF相当于x % 16

这是有效的,因为你正在使用2的幂。

答案 1 :(得分:0)

这里的关键是16是2的幂,所以你可以利用计算机利用二进制表示来实现你想要的按位运算符这一事实。

考虑以二进制表示的16的倍数:

0001 0000 // n = 16, n%16 = 0
0010 0000 // n = 32, n%16 = 0 
0011 0000 // n = 48, n%16 = 0
0100 0000 // n = 64, n%16 = 0

现在看看n % 16非零的一些数字:

0000 0111 // n = 7,  n%16 = 7
0001 0111 // n = 23, n%16 = 7
0010 0001 // n = 33, n%16 = 1
0100 0001 // n = 65, n%16 = 1

请注意,余数只是最低有效4位(半字节) - 因此我们只需要构造一个按位表达式,使这些位保持不变,同时将所有其他位屏蔽为零。这可以通过使用二进制值15执行按位AND运算来实现:

x = n & 0xF