涉及比特位操作的算法题有很多,本文对其中常见的一些进行汇总,所有资源来自网络。
一、判断一个正整数是否是2的整数次幂
判断一个整数N是否是2的整数次幂,这是个很常见的问题。比如4、8等都是2的整数次幂,而6不是。
解法1)一个基本的解法是设定i=1开始,循环乘以2直到i>=n,然后判断i是否等于n即可。
解法2)当然还有一个更好的方法,那就是观察一个数字的二进制表示,如n=101000,则我们可以发现n-1=100111。也就是说n=>n-1是将n最右边的1变成了0,同时将n最右边的1右边的所有比特位由0变成了1。因此如果n & (n-1) == 0就可以判定数字n为2的整数次幂。(注意一个地方,n=0为特殊情况,需要额外考虑,因此最终的判定表达式为n && !(n & (n-1)) ).
bool powOf2(int n)
{
return n && !(n & (n-1));
}
二、求一个整数二进制表示中1的个数
如给定N=6,则它的二进制表示为0110,所以二进制表示中1的个数为2。
解法1)一个自然的方法是将N和1按位与,然后将N除以2,直到N为0为止。该算法代码如下
int numOf1