`
buluzhai
  • 浏览: 108113 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

判断一个数是否2的幂的技巧

阅读更多
设要判断的数是无符号整数X。
首先判断X是否为0,如果为0则不是2的n次幂,返回。
X和X-1进行按位与操作,如果结果是0,则说明这个数是2的n次幂;如果结果非0,则说明这个数不是2 的n次幂。

证明:
如果是2的n次幂,则此数用二进制表示时只有一位是1,其它都是0。减1后,此位变成0,后面的位变成1,所以按位与后结果是0。
如果不是2的n次幂,则此数用二进制表示时有多位是1。减1后,只有最后一个1变成0,前面的 1还是1,所以按位与后结果不是0。
f = v && !(v & (v - 1));



举个例子:                                              
如果n = 16 = 10000, n-1 = 1111
那么:
10000
& 1111
----------
                          0
再举一个例子:如果n = 256 = 100000000, n-1 = 11111111
那么:
100000000
&11111111
--------------
        0
分享到:
评论

相关推荐

    word使用技巧大全

    24、如何将一个表格垂直拆分为两个的表格 87 25、巧用Word的扩展选定功能 87 26、Excel单元格多于15位数字的输入 87 27、Word中磅与厘米的换算 87 28、计算机中容量单位的换算 88 29、在Excel中复制上一单元格 88 30...

    delphi 开发经验技巧宝典源码

    0237 如何实现一个应用程序只能打开一个进程 158 7.4 其他数据处理技术 159 0238 对计算结果四舍五入 159 0239 获取一个字符的ASCII值 159 0240 判断字符串中是否有文字符 160 0241 如何从字符串中提取...

    LeetCode判断字符串是否循环-rockblog:一个私人博客

    的相反数,是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1。 由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n的二进制表示的每一位取反再加上 1,因此它的原理如下: 难度简单359...

    delphi 开发经验技巧宝典源码06

    0237 如何实现一个应用程序只能打开一个进程 158 7.4 其他数据处理技术 159 0238 对计算结果四舍五入 159 0239 获取一个字符的ASCII值 159 0240 判断字符串中是否有文字符 160 0241 如何从字符串中提取...

    定点补码一位乘法器的设计.rar

    技巧上表现在分解乘数的每一位上的1为高一位的一个+1和本位上的一个-1:X×Y=X×(-1+Yi×2i) (逐项展开则得)=X×[-Y0+Y1×2-1+Y2×2-2+…+Yn×2-n]=X×[-Y0+(Y1-Y1×2-1)+(Y2×2-1-Y2×2-2)+…+...

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    4.2.3 OR——判断多个条件中是否至少有一个条件成立 155 4.2.4 XOR——判断多个条件中是否有一个条件成立 156 4.2.5 IF——根据条件判断而返回不同结果 156 4.2.6 IFNA——判断公式是否出现#N/A错误 158 4.2.7 ...

    挑战程序设计竞赛(第2版)

    3.1.2 假定一个解并判断是否可行 3.1.3 最大化最小值 3.1.4 最大化平均值 3.2 常用技巧精选(一) 3.2.1 尺取法 3.2.2 反转(开关问题) 3.2.3 弹性碰撞 3.2.4 折半枚举(双向搜索) 3.2.5 坐标离散化 3.3 活用各种...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    3.2 调整到上一个/下一个2的幂 57 3.2.1 向下舍入 58 3.2.2 向上舍入 59 3.3 判断取值范围是否跨越了2的幂边界 59 3.4 习题 61 第4章 算术边界 63 4.1 检测整数边界 63 4.2 通过加减法传播边界 65 4.3 通过...

    语言程序设计课后习题答案

    2-18 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。 解: 源程序: #include <iostream.h> int main() { int i; cout 请输入一个数字:"; cin >> i; cout 您输入一个数字是" ; return 0; } 程序...

    算法导论(part1)

    第一个循环不变式出现在第2章中;整本书中循环不变式共用到了数十次。 ·很多概率分析都进行了重新编写。特别地,我们在十多处用到了“指示器随机变量”(indicator random variable)技术,它简化了概率分析,在随机...

    算法导论(part2)

    第一个循环不变式出现在第2章中;整本书中循环不变式共用到了数十次。 ·很多概率分析都进行了重新编写。特别地,我们在十多处用到了“指示器随机变量”(indicator random variable)技术,它简化了概率分析,在随机...

    ACM巨全模板 .pdf

    2.威佐夫博弈(两堆每次取至少一个或一起取一样的) 3.约瑟夫环 4.斐波那契博弈 (取的数依赖于对手刚才取的数) 5.sg函数 数论: 1.数论 素数检验:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验 2.拉格朗日...

    ACM竞赛技巧总结

    判断是不是2的幂8.lowbit函数 :9.Runtime Error10.除vector和string以外的STL都不支持*(it+1)的访问形式11.位运算的妙用12.运用fill函数给任意容器赋任意值(1)给二维数组赋值(2)其他容器 1.更快(最快)的...

    leetcode分类-Leetcode:力码

    幂到一个非常大的指数。 102 (Java) 泛型不是协变 659 Python 集合和枚举的使用。 子序列和子串的区别。 660去掉9是什么意思? 665 判断数组是否非递减(<=1 异常) 667 美丽的排列 2:构造一个包含 [1,n] 的长度...

    C程序范例宝典(基础代码详解)

    实例022 求一个正整数的所有因子 27 实例023 一元钱兑换方案 28 实例024 对调数问题 29 实例025 数平方和运算的问题 30 1.5 数组 31 实例026 逆序存放数据 32 实例027 相邻元素之和 33 实例028 选票...

    狂人C程序员入门必备

    2.7.3 一个技巧 2.7.4 更高效率的写法 2.8 算法的特性 小结 概念与术语 风格与习惯 常见错误 牛角尖 练习与自测 第3章 运算符、表达式及语句 3.1 C的“动词”及“动词”的“宾语” 3.2 表达式——C语言的“词组 ...

Global site tag (gtag.js) - Google Analytics