不使用/,%,+和*,如何判断一个数能否被3整除

如果n的二进制末位为0,那么n和n>>1同时被3整除或者不整除

如果n的二进制末位为1,那么n和(n>>1)-1同时被3整除或者不整除

 

3是一个比较特别的数,其二进制表示是0b11,也就是说任何一个数乘以3的结果实际上是这个数与其左移1位后相加的结果。现在给出一个数a,假设它能被3整除,结果是b,即a=3*b,那么从二进制乘法运算判断出,b的最低位与a的最低位一定是相同的,从而得到了b的最低位,将这个位左移1位变成次低位,那么a的次低位以上的比特减去这个位后在次低位上的结果一定是b的次低位。以此类推可以求出b的各个比特,如果最后能完成对b的各位的计算,那么a能够被3整除,否则不能被3整除。

 

bool IsTimesOf3(int n)  
{  
    int s;  
    if (n < 0)  
        n = - n;  
    while (n > 0)  
    {  
        s = n & 1;  
        n >>= 1;  
        n = n - s;  
    }  
    return (n == 0);  
}

猜你喜欢

转载自leowzy.iteye.com/blog/1544845
今日推荐