1. 程式人生 > >判斷一個數是否為2的N次方

判斷一個數是否為2的N次方

在閱讀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)) } }

結果無任何輸出, 說明兩種方法計算結果一致。
也可以全部打印出來觀察。

歡迎補充指正!