判断是否是2的N次方各方法运行速度比较
时间:2011-03-03 来源:grayboy
没想到各位的热情着么高,呵呵,感谢每一位关注的朋友,本来也想写篇关于回复中每个方法的介绍的,不过被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
相关阅读 更多 +