位运算的妙用_判断2的乘方和二进制1的个数

本文介绍了如何使用位运算判断一个正整数是否为2的乘方,以及高效计算正整数二进制表示中1的个数。通过位移和位与等运算,解析了多种解决方案,并探讨了相关算法的效率和原理。

本来定好每个星期写一遍算法的博客的,可是因为最近赶项目,博客停止更新一段时间了,现在抽空继续更新。本来心情挺好的,一看手机,欠费两百多,真是日了狗了,百度云没有设置只能 wifi 下下载和上传,用了我的流量来下载,我的内心是崩溃的。
扣费截图


一、判断一个整数是否是2的乘方

1.题目:实现一个方法,判断一个正整数是否是2的乘方(比如 16 是 2 的 4 次方,返回 True;18 不是 2 的乘方,返回 False )。要求性能尽可能高。

解法一:
创建一个变量 Temp ,初始值是 1 。然后进入一个循环,循环中每次让Temp和目标整数比较,如果相等,则说明目标整数是 2 的乘方;如果不相等,则让 Temp 增大乘 2 ,继续循环比较。当 Temp 大于目标整数时(所以循环的判断条件是小于等于),说明目标整数不是 2 的乘方。

    /**
     * 判断整数(number)是否是2的乘方
     * 
     * @param number
     * @return
     */
    public static boolean isPower2_ONE(int number) {
        int temp = 1;
        while (temp <= number) {
            if (temp == number) {
                return true;
            }
            temp = temp * 2;
        }
        return false;
    }

优化:
先了解一个知识点:<<(左移)乘二,>>(右移)除二

具体

C语言程序设计基础 数据类型: 数据类型定义与格式化调用一致(涉及强制转换(涉及void任意型)) 整型与字符型之间存在对应关系(涉及ascii表及isxxxxx类库函数) 除for()内的i,n或Arr的下标外均可将int换为long long 运算过程中可能会溢出int甚至long long(涉及取模运算) 注意有时long long不宜直接进行非整除得double? 注意有时需要unsigned int或unsigned long long型 注意区分1(默认int),1LL,1ULL(常见于位运算>>或<<中) 指针根据指向对象亦有类型;变量地址必为int整型 函数根据返回的情况具有数据类型,注意函数参数所需类型 int,long long,double型分别对应绝对值函数abs,labs,fabs 数据结构: 条件语句: if-else或if-else if-else,避免并列if的出现 注意:()后无分号;运算符及其优先级(括号);非0即真 选择语句: switch-case-break-default 注意break的对跃出当前case的作用 循环语句: for/while/do-while(L.不定组输入);break;continue;goto 注意:for中i的首末及增量;while死循环;do-while至少执行一次 注意:i++++i的差异及初值经循环后的意义;注意for()后的分号 注意:多级循环注意下标检索的区分;提前break或continue可优化 注意:break仅跳出一层循环,可考虑sign或flag等额外标记处理之 注意:goto A;A:后不能直接连定义语句,而需分号空语句单独占一行 注意:时间复杂度(数据的预处理及检索;不要反复调用strlen等函数) 输入输出: 输入基础: scanf(不支持空格/换行),fgets(不支持换行符),getchar(支持字符) scanf:需对非字符串型取地址&传入;字符(匹配)或字符串前消空白 scanf:可返回正确输入的个数;遇EOF(cntrl^Z)失败 fgets:可能会占用str余下位置填充’\n’;len(str)=strlen(str)-1;删换行 getchar:getchar()可消去”%c””%s”scanf输入前的空白字符 多组输入: 若仅需实现提问次数的限制,直接while(n--)即可,否则建议for()处理 可考虑数组存储 不定输入: while(scanf(“%d%d”)==2)//正常输入则继续 while((c=getchar())!EOF&&c!=’\n’)//非终止或换行则继续 while(fgets(str,sizeof(str),stdin!=NULL)//非空则继续至换行 while(1){终止条件} 可考虑数组存储 输出基础: printf(注意添加换行);puts(自动换行) printf格式化输出(符号;前导;宽度;精度);注意特殊转义’\’;%% 一次输入可直接对应一次输出,或采用数组存储一次性输入输出 常量变量: 常量可采用宏定义:EPS;MAX_N且:acos(-1)=π;exp(1)=e str[]=”Hello”为不可修改的字符串常量;拓展:指针常量与常量指针 变量分全局变量局部变量;函数调用时全局变量不在形参列表中 变量必须先定义再调用;定义调用需要数据类型的对应 浮点精度 浮点数的二进制存储方式 浮点数比较:EPS精度控制;fabs(a-b)<=EPS判断相等? /截断;floor下取整;ceil上取整;round四舍五入;int(x+0.5)强制转换? 模拟浮点数:整数部分先输出,小数部分借助.x输出,得形式上的浮点数 超高精度的四则运算及阶乘等:涉及数组与进位模拟(可能需四舍五入) 位运算 基本运算:&(位与),|(位或),^(异或),~(取反),>>(右移),<<(左移) 基础取位操作:(x>>i)&1可取x第i位的二进制数 基础置位操作:(x>>i)&0可置x第i位数位为0;|1则可置之为1 快速计算与奇偶判断:快速幂;二的乘方与幂次判断;奇偶数判断 数组 字符串 指针 库函数 函数 递归
最新发布
12-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值