判断是否是2的N次方各方法运行速度比较
今天写了篇文章判断一个数是否是2的N次方http://www.cnblogs.com/mybear/archive/2011/03/03/1969851.html
没想到各位的热情着么高,呵呵,感谢每一位关注的朋友,本来也想写篇关于回复中每个方法的介绍的,不过被undefined
朋友抢了先,各位可以参考他的两篇文章
1)一名曾经的测试人员, 看大家贡献的关于2的n次方的检测的代码
根据回复,我整理出了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
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架