判断一个数是否为2的N次方

版权声明:转载请注明出处,谢谢。 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))
	}
}

结果无任何输出, 说明两种方法计算结果一致。
也可以全部打印出来观察。

欢迎补充指正!

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/83270333