int x = n / 3; // <-- make this faster
// for instance
int a = n * 3; // <-- normal integer multiplication
int b = (n << 1) + n; // <-- potentially faster multiplication
Run Code Online (Sandbox Code Playgroud) 我读过这个有趣的答案," 检查数字是否可以被3整除 "
虽然答案是Java,但它似乎也适用于其他语言.
显然我们可以这样做:
boolean canBeDevidedBy3 = (i % 3) == 0;
Run Code Online (Sandbox Code Playgroud)
但有趣的部分是另一个计算:
boolean canBeDevidedBy3 = ((int) (i * 0x55555556L >> 30) & 3) == 0;
Run Code Online (Sandbox Code Playgroud)
为简单起见:
0x55555556L = "1010101010101010101010101010110"
铌
还有另一种检查方法:
通过计算奇数位位置的1位,可以确定整数是否可被3整除,将该数乘以2,在偶数位添加1位数将它们加到结果中并检查结果是否可被整除3
例如 :
93 10(可被3整除)
01011101 2
它2在奇数位置有位,在偶数4位有位(位置是基于基数2位的零)
所以2*1 + 4 = 6哪个可被整除3.
起初我认为这两种方法是相关的,但我没有找到.
题
如何
boolean canBeDevidedBy3 = ((int) (i * 0x55555556L >> 30) & 3) == 0;
Run Code Online (Sandbox Code Playgroud)
- 实际确定是否i%3==0?