现在的位置: 首页 > 综合 > 正文

判断是否是2的N次方各方法运行速度比较

2012年07月15日 ⁄ 综合 ⁄ 共 1395字 ⁄ 字号 评论关闭

今天写了篇文章判断一个数是否是2的N次方http://www.cnblogs.com/mybear/archive/2011/03/03/1969851.html

没想到各位的热情着么高,呵呵,感谢每一位关注的朋友,本来也想写篇关于回复中每个方法的介绍的,不过被undefined

朋友抢了先,各位可以参考他的两篇文章

1)一名曾经的测试人员, 看大家贡献的关于2的n次方的检测的代码

2)结果正确不代表思路正确

根据回复,我整理出了6个正确的方法,如下

#region Neeley http://www.cnblogs.com/mybear/
public static bool Check1(int num)
{
    int i = 1;
    while (true)
    {
        if (i > num)
            return false;
        if (i == num)
            return true;
        i = i * 2;
    }

}

public static bool Check2(int num)
{
    if (num == 1)
        return true;
    else
    {
        do
        {
            if (num % 2 == 0)
                num = num / 2;
            else
                return false;
        }
        while (num != 1);
        return true;
    }
}
#endregion

#region 执手泪眼 http://www.cnblogs.com/liszt/
public static bool Check3(int num)
{
    double result = Math.Log(num, 2);
    return result.ToString().IndexOf(".") < 0;
}
#endregion

#region llzhzhb http://http://home.cnblogs.com/141189/
//x << (31 - i) >> 31 就 是取二进制数字中的第i+1位
public static bool Check4(int num)
{
    uint x =Convert.ToUInt32(num);
    bool y = false;
    for (int i = 0; i < 32; i++)
    {
        if (x << (31 - i) >> 31 == 1)
            if (!y)
                y = true;
            else
            {
                y = false;
                break;
            }
    }
    return y;
}
#endregion

#region 西夏普躲耐特 http://www.cnblogs.com/hncjp1989/
public static bool Check5(int num)
{
    return ((num & (num - 1)) == 0) ? true : false;
}
#endregion

#region lipan http://www.cnblogs.com/lipan/
public static bool Check6(int num)
{
    if (num == 1)
        return true;
    return Regex.IsMatch(Convert.ToString(num, 2), "^10+$");
}
#endregion

此六种方法从上到下一次是Check1----Check6,循环1到99999999次,开发环境VS2008+Window7,使用Release编译,执行结果是:

从上图可以看到,最快当然还是x & (x - 1)

其次是我自己写的一个do while循环,看来循环并不一定是最坏的方法

源码如下,大家有自己的方法,也可以添加上来,比较下速度!

http://files.cnblogs.com/mybear/ConsoleApplication.rar

抱歉!评论已关闭.