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

简介:

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

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

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如需转载自行联系原作者


相关文章
|
3月前
玩转位运算
玩转位运算
|
6月前
|
存储 Java
一篇搞定位运算(&、|、^、~、>>、<<、>>>)
我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1
32 0
|
8月前
|
算法 Java 编译器
第 13 天_位运算
第 13 天_位运算
59 0
|
8月前
位运算专题(个人理解)
位运算专题(个人理解)
38 0
|
9月前
|
算法 数据安全/隐私保护
基本的位运算
基本的位运算
|
10月前
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
60 1
|
11月前
位运算(1)
位运算(1)
|
存储
【位运算】怕位运算?有我你何足畏惧
【位运算】怕位运算?有我你何足畏惧
57 0
位运算的小技巧
快速学习位运算的小技巧