版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/butterfly5211314/article/details/83270333
在阅读goim源代码的时候, 在ring.go中看到这句代码:
// 2^N
if num&(num-1) != 0 {
// ...
}
原来这是判断2的N次方。
然后总结了下, 判断一个数n是否为2的N次方的办法(要求n>0):
第一种:笨办法, 2^i,递增i
func judge(n int) bool {
if n <= 0 {
return false
}
i := 0
sqrtn := int(math.Sqrt(float64(n))) + 1
for {
if int(math.Pow(float64(2), float64(i))) == n {
return true
}
if i >= sqrtn {
break
}
i++
}
return false
}
第二种:用 n & (n - 1)
func judge2(n int) bool {
if n <= 0 {
return false
}
return n&(n-1) == 0
}
测试如下:
for i := 0; i <= 1024000; i++ {
one := judge(i)
two := judge2(i)
if one && !two || !one && two {
fmt.Println(i, judge2(i), judge(i))
}
}
结果无任何输出, 说明两种方法计算结果一致。
也可以全部打印出来观察。
欢迎补充指正!