今天写了篇文章判断一个数是否是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循环,看来循环并不一定是最坏的方法
源码如下,大家有自己的方法,也可以添加上来,比较下速度!
作者:GrayBoy
出处:http://www.cnblogs.com/mybear/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
互相学习,共同进步!。