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

将4的幂次方写成2进制形式后,很容易发现有个特点,2进制中只有1个1(1在奇数位置),并且后面跟了偶数个0;因此问题可以转化为判断1后面是否跟了偶数个0就可以了。

4的整数次幂的二进制可以写为2^(2*n),即也可以写成2的幂次方,当然就满足2的幂次方的条件,即num&(num-1)==0.

思路:首先用条件num&(num-1)==0来判断是否为2的幂次方,若不满足,则不是。若满足,再用条件num&0x5555 5555 来判断,若为真,则这个整数是4 的幂次方。否则不是。

#include "stdafx.h"
//#include "stdio.h"//#include "stdlib.h"
bool func(unsigned int x)//判断x是否是4的幂次方
{
    if ( x&(x-1) )//判断x是否为2的幂次方
        return false;
    return x&0x55555555;//判断1是否在奇数位置上
}
int log4(int value)//递归判断一个数是4的多少次方
{
    if(value==1)
        return 0;
    else
    {
        value>>=1;//往右移位
        return 1+log4(value>>1);//往右移位
    }

    }
int _tmain(int argc, _TCHAR* argv[])
{
    int num;
    cout<<"请输入一个整数:";
    cin>>num;
    if(func(num))//使用与运算判断一个数是否是2的幂次方
        cout<<num<<"是4的"<<log4(num)<<"次方!";
    else
        cout<<num<<"是4的幂次方!";
    system("pause");
    return 0;

}
时间: 2024-10-22 01:22:00

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

判断一个数是否为2的幂

判断一个数是否为2的幂 思想 例1. 4的补码为: 00000100 3的补码为: 00000011 4 & 3 = 0 因此 n & n-1 == 0,此数即为2的幂(n > 0) 例2. 4的补码为: 00000100 -4的补码为: 11111100 4 & -4 = 4 因此 n & -n == n,此数即为2的幂(n > 0) 公式 n & n - 1 == 0 (n > 0) 或 n & -n == n (n > 0) 原

JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??

<script type="text/javascript">     var x = 4.23323;//测试的数字     var y = String(x).indexOf(".") + 1;//获取小数点的位置     var count = String(x).length - y;//获取小数点后的个数     if(y > 0) {         alert("这个数字是小数,有" + count + "

判断一个数是否是2的幂次方以及保留一个数的最高位的方法

#include <stdio.h> int check_power(unsigned int n){ /**************************************** * 如果n是2的幂,那么 (n-1)也就是其二进制全为1的数 *****************************************/ if (n & (n-1)) { return 1; } return 0;}unsigned int get_next_power(unsigned i

Java基础——使用三元运算符判断一个数的奇偶性

要求: 使用三元运算符判断一个数的奇偶性 实现代码: /** * 使用三元运算符判断用户输入的一个数的奇偶性 */ import java.util.Scanner; public class Odd_even { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个整数:"); long num1 = input.nextLo

vuex中filter的使用 &amp;&amp; 快速判断一个数是否在一个数组中

vue中filter的使用 computed: mapState({ items: state => state.items.filter(function (value, index, arr) { return index < 5 }) }), 如上所示,对于vuex,我们在使用mapState获取state时, 可以使用filter来过滤其中的元素,在filter的回调函数中接受三个参数,第一个是value,即每一个元素的值: 第二个是index, 即每一个元素所在的index, 第三个

如何快速判断一个数是不是2幂数

现代的计算机是二进制的,在许多地方都要用到2的幂数,比如4,8,16,32,64,128等这些数字.并且在许多内存分配函数也是以这些数字为值进行分配的.那么如何快速判断一个数是不是2的幂数呢? 今天在看内核代码的时候,发现内核中是这样做的,其思想也是非常的简单! 基本思想是: 十进制表示                           二进制表示 4                                    100 3                               

c语言快速判断一个数是偶数还是奇数

#include <stdio.h> int main() { int a; while(1) { printf("please input the number:\n"); scanf("%d",&a); if(a&1) { printf("%d是奇数\n",a); } else { printf("%d是偶数\n",a); } } return 0; } 这是一种个人感觉最快的方法啊! 从二进制

判断一个数是否是质数

质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,能被整除以其他自然数(质数),换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数. 如何判断一个数是否是质数: 代码1: 1 /** 2 * 判断给定的数字是否为素数(质数) 3 * @param num 4 * @return 5 */ 6 public static boolean isPrime(int num){ 7 if(num < 2){ 8 return false; 9 } 1

判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路

定义:约数只有1和本身的整数称为质数,或称素数. 计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效. 1)直观判断法 最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可.C++代码如下: bool isPrime_1( int num ) { int tmp =num- 1; for(int i= 2;i <=tmp; i++) if(num %i==