判斷一個數是否為2的N次方
阿新 • • 發佈:2018-11-01
在閱讀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))
}
}
結果無任何輸出, 說明兩種方法計算結果一致。
也可以全部打印出來觀察。
歡迎補充指正!