一个关于2的次方问题



问题:

判断一个正整数是否是2的次方(比如16是2的四次方,返回1;不是则返回0)。(要求性能尽可能高)


解法一:

int check(int number){
    int temp = 1;
    while(temp <= number){
        if(temp == number){
            return 1;
        }
        temp = temp * 2;
    }
    return 0;
}

思路简单一个一个比较,时间复杂度O(logN)


解法二:

int check(int number){
    int temp = 1;
    while(temp <= number){
        if(temp == number){
            return 1;
        }
        temp = temp << 1;
    }
    return 0;
}

通过位运算进行了一点优化,时间复杂度仍然为O(logN),本质上没什么区别


解法三:


int check(int number){
    if(number & (number-1) == 0){
        return 1;
    }
    else{
        return 0;
    }
}

通过一次减法和与运算,时间复杂度只有O(1),在本质上有很大的优化。

具体思路: 2的n次方数的二进制是有规律的

2:  10            2-1:        1        &   0
4:  100            4-1:        11        &   0
8:  1000            8-1:        111     &   0
16:  10000        16-1:        1111    &   0
32:  100000        32-1:    11111    &   0
    ...             ...
    2^n                     2^n-1

    7:  0111        7-1:    0110    &   0110
    36: 100100      36-1:  100011  &   100000

将左右两边的结果做与运算,结果很明显。

计算机算加减乘除的时间对比

位运算 优化运算速度



2018/10/12

By PQ

原文地址:https://www.cnblogs.com/glasses/p/10023814.html

时间: 2024-10-13 08:06:04

一个关于2的次方问题的相关文章

一个数字的 0 次方为什么总是等于 1

从结城浩大师的<程序员的数学>一书中看到这个问题,里面是这样子解释的 : 一般人会这样子想 —— 一个数的 n 次方,就是这个数自乘 n 次,比方说 10 的 3 次方,就是 10 x 10 x 10 等于 1000: 可是 10 的 0 次方,应该是没有任何数相乘,结果应该是 0 才对啊,为什么结果为 1 呢 ? 我们换一个角度来思考这个问题: 10 的 3 次方结果为 1000 10 的 2 次方结果为 100 10 的 1 次方结果为 10 10 的 0 次方结果为 1 大家观察一下上面

如何有效的实现一个正整数的N次方

以时间复杂度为logn来实现一个数的N次方: #include<iostream> using namespace std; int pow(int a,int index) { int result=1; int temp=a; for(;index;index>>=1) { if(index&1) result*=temp; temp*=temp; } return result; } int main() { cout<<pow(2,4)<<e

判断一个整数不是2的阶次方树

如果是一个2的阶次方,那么它的二进制数的首位一般是1,后面接若干个0.比如8就是1000,64是100 0000. 如果将这个数减1后,再与该数做和&运算,则改全为0. package cn.usst.DataTest; import java.io.*; /** * 从键盘输入一个值 */ public class InputData { static private String s = ""; static public void input() { BufferedRe

剑指Offer面试题11(Java版):数值的整数次方

题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题 1.自以为很简单的解法: 由于不需要考虑大数问题,这道题看起来很简单,可能不少应聘者在看到题目30秒后就能写出如下的代码: public double powerWithExponent(double base,int exponent){ double result = 1.0; for(int i = 1;i<= exponen

剑指offer 13:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 问题分析 计算一个浮点数的整数次方,主要考察的是对输入数据的完整性的预估能力.针对此问题,输入数据可能存在以下情况: 1.底数不为0,指数都为整数 2.底数不为0,指数都为负数 3.底数为0,指数为负数(出现零除情况) 4.底数为0,指数为正数(给定特殊值0或1) 代码实现的逻辑并不复杂,主要是需要考虑到所有可能存在的输入情况,同时需

delphi中的Format函数详解

首先看它的声明:[[email protected]][@21ki!] function Format(const Format: string; const Args: array of const): string; overload;[[email protected]][@21ki!] 事实上Format方法有两种形式,另外一种是三个参数的,主要区别在于它是线程安全的,[[email protected]][@21ki!]但并不多用,所以这里只对第一个介绍:[[email protect

转(一致性哈希算法(consistent hashing))

转自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance)

每日一九度之 题目1084:整数拆分

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2720 解决:1099 题目描述: 一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式. 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2. 用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过100

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意