判断整数是不是是2的幂次方

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断整数是不是是2的幂次方相关的知识,希望对你有一定的参考价值。

参考技术A 1. 看到这个问题,直接的想法估计是对这个数直接判断,如果这个数是2的n次方幂,那可以将这个数先对2取模为0,再对2整除,再对2取模,一直到这个数最后为2;如果不能这样做,那么这个整数就不是2的n次方幂,代码如下:
int i = 128; //待判断的整数
int count = 1; //待判断的整数是2的count次方
while (i)

if (2 == i)

printf("YES: %d\n",count);
break;

if (0 == i%2)

i /= 2;
count++;

else

printf("NO\n");
break;


2. 其实还可以这样想,一个整数,若是2的n次方,有没有想过对这个整数的2进制进行考虑,比如12,它的二进制为:1100

2 10
4 100
13 1101
16 10000
32 100000
........
大家发现没有,凡是2的n次方的整数,它的二进制的所有位中都只有一个1,并且这个1肯定在最高位。既然这样的话,那么这个问题就变成了如何来计算二进制位中1的个数,对于这个计算算法,《编程之美——微软技术面试心得》这本书中讲了三种方法,都很精辟,这儿我贴出其中一种的判断方法,如下:
int fuc(int i)

int count = 0;
while(i)

count += i&0x01;
i >>= 1;

if(count < 2)

printf("YES"); //若count = 0 或者 count =1,表明 i 是 2 的n次方

else

printf("NO");


在向右移位的过程中,我们会把最后一位直接丢弃。因此,需要判断最后一位是否为1,而“与”操作可以达到目的。可以把这个八位的数字与00000001进行“与”操作。如果结果为1,则表示当前八位数的最后一位为1,否则为0。

2021-11-06:3的幂。给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n ==(

2021-11-06:3的幂。给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3**x。力扣326。

答案2021-11-06:

如果一个数字是3的某次幂,那么这个数一定只含有3这个质数因子。
4052555153018976267是int型范围内,最大的3的幂,它是3的38次方。
这个4052555153018976267只含有3这个质数因子,如果n也是只含有3这个质数因子,那么4052555153018976267% n == 0;反之如果4052555153018976267% n != 0 说明n一定含有其他因子。
时间复杂度:O(1)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {

    ret := isPowerOfThree(81)
    fmt.Println(ret)

}

func isPowerOfThree(n int) bool {
    //3的38次方
    return (n > 0 && 4052555153018976267%n == 0)
}

执行结果如下:


左神java代码

以上是关于判断整数是不是是2的幂次方的主要内容,如果未能解决你的问题,请参考以下文章

leetcode326.三的幂(342.四的幂/231.二的幂)

快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方!

递归:判断一个数是否是2的幂

递归:判断一个数是否是2的幂

递归:判断一个数是否是2的幂

2的幂