我想要一个算法,只使用移位,加或减操作来查找一个数是否是6的倍数。所以,基本上只是二元运算。如何检查数字是否是6的倍数?
到目前为止,我认为我应该逻辑右移数字两次除以4,然后从中减去6。但我知道我的方法有问题,不知道是什么。
我想要一个算法,只使用移位,加或减操作来查找一个数是否是6的倍数。所以,基本上只是二元运算。如何检查数字是否是6的倍数?
到目前为止,我认为我应该逻辑右移数字两次除以4,然后从中减去6。但我知道我的方法有问题,不知道是什么。
整除怎么样保持减去的数量由6至它达到零。 如果您得到零,则数字可以被整除6,否则不可以。 或 保持数字除以2(二进制移位操作),直到数字小于12. 然后从中减去6。如果小于零(不可除) 如果零可分。 如果不减去3 如果小于零(不可整除) 如果零可以整除。
Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_6
It is a multiple of six if BOTH of the following statements are true:
1) The last digit (ones place) is 0, 2, 4, 6, or 8.
2) When you add all the digits together, you get a multiple of 3.
Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_3
1) Start with a number N.
2) Sum the digits of the number, and get M.
3) If M is larger than 10, set N=M and return to stage 2.
4) Otherwise, M is now smaller than 10. If M is 0,3,6 or 9, then N is a multiple of 3
您可以尝试使用可用的基本操作来实现除法算法。从四年级的基本长除法算法可能不够(只是做事情,而不是基地10基地2个,与bitshifting而不是乘)
好的。这是我将如何去做的(只是第一个想法):
6的倍数是2和3的倍数,所以它应该同时满足2和3的可分性标准...所以......
检查可分2:
如果余数= 1,则返回FALSE,否则继续。
检查由2整除,可明显通过(N & 1 == 0)也实现,如上所述。这只是简单地检查N为二进制表示的最后一位数字:如果它是1,N为奇数(因此由2 NOT整除),如果它是0,这是完全除尽...由3
如果我们扩展操作“位掩码”和“位移”的范围内,这很简单。
由于不少人已经说过,可除数为2等于(n & 1) == 0
。 3的可分性在二进制中相对容易。初始化累加器a
为0,然后重复a += (n & 3); n = (n >> 2);
直到n为0如果(且仅当)一个是3是3
ň整除你可以保持从数减去6,看到它得到为零。如果结果小于零,那么它不能被6 – 2012-03-16 04:31:34
整除效率不高,但可以仅使用减法实现模函数。 – st0le 2012-03-16 04:31:40
如果这是在真正的程序中使用:不要这样做。只需使用'num%6',让编译器找出最快的方法。更有可能的是,简单地使用CPU的'mod'操作将比任何你想出的骇客都快。 – 2012-03-16 15:02:50