两个与位运算有关的小问题

简介:

         两个与位运算有关的小问题

       在读《编程之美》一书时,书中提到两个小问题:

1.如何求算N!的二进制表示最低位1的位置。

2.如何用最简便最快的方法判断一个正整数是否是2的方幂。

       对于第一个问题:对于任何一个整数n,当表示成二进制时,若最低位为1,则该数肯定是奇数,否则为偶数。若是奇数,则n肯定不含质因子2.例如9的二进制形式是1001,最后一位位1,则肯定不含因子2,而12的二进制形式是1100,则肯定含因子2.但是将1100右移2位就变成0011,即将12除以2^2,此时0011为奇数。从这里可以发现一个规律,要求一个数的二进制表示形式最低位1的位置,相当于求算n有多少个因子2。因为假如一个整数表示成二进制是r0r1r2.....rk.....rn,如果rk是最低位为1的位置,那么从r(k+1)到rn都为0,此时将其右移(n-k)位,则rk在最低位,此时该二进制必定不包含因子2,而将二进制右移1位相当于除以2,即求算rk的位置相当于求算因子2的个数。而求算N!中含有2的个数很容易求算。

复制代码
int location(int n)
{
int low=0;
while(n)
{
low+=n>>1;
n>>=1;
}
return low;
}
复制代码

      对于第二个问题:如果一个整数是2的方幂,即能表示成2^n的形式,则表示成二进制必然是rn.....rk....r1r0,rn为1,其他所有的位都为0,此时 n & (n-1)的结果必然为0,因此只需判断n & (n-1)的结果是否为0来判断是否是2的方幂。

int judge(int n)
{
return n&(n-1)==0;
}

                

本文转载自海 子博客园博客,原文链接:http://www.cnblogs.com/dolphin0520/archive/2011/10/20/2219675.html如需转载自行联系原作者


相关文章
|
12月前
|
存储 Java
一篇搞定位运算(&、|、^、~、>>、<<、>>>)
我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1
51 0
|
4月前
|
编译器 Linux C++
详细解读C++中的位运算总结
详细解读C++中的位运算总结
25 0
|
4月前
|
机器学习/深度学习
常见位运算的总结
常见位运算的总结
33 0
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
82 1
位运算专题(个人理解)
位运算专题(个人理解)
66 0
|
算法 数据安全/隐私保护
基本的位运算
基本的位运算
|
算法
位运算能做什么
位运算能做什么
51 0
|
存储
位运算及A+B
位运算及A+B