一、2的次冪
題目描述:給定一個整數,編寫一個函數來判斷它是否是 2 的冪次方。
解法: n&(-n)將除最後一位的1之外的所有的數字置爲0(因爲-n=~n+1,所以n&(-n)==n&(~n+1)),例如
7對應的二進制爲0111
-7對應的二進制爲1001
7&(-7)=0001
代碼實現:
public boolean isPowerOfTwo(int n) {
if (n == 0) return false;
long x = (long) n;
return (x & (-x)) == x;
}
二、位1的個數
題目描述:編寫一個函數,輸入是一個無符號整數,返回其二進制表達式中數字位數爲 ‘1’ 的個數(也被稱爲漢明重量)。
思想:使用n&(n-1)逐個消去最後一個1
代碼實現:
public int hc(int n)
{ int count=0;
while(n>0)
{
n=n&(n-1);//消除最後一個1
++count;
}
return count;
}
三、[0,num]範圍內的整數的二進制形式中1的總數
題目描述:給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進制數中的 1 的數目並將它們作爲數組返回。
思想:使用動態規劃來下實現數字的推導.例如 1(0001)2(0010) 3(0011) 4(0100) 5(0101) 6(0110 ) 7(0111) 8(1000)等
1=0+2^0(pop_count(1)=pop_count(0)+1)
2=0+2^1( pop_count(2)=pop_count(0)+1)
3=1+2^1 (pop_count(3)=pop_count(1)+1)
4=0+2^2(pop_count(4)=pop_count(0)+1);
5=1+2^2(pop_count(5)=pop_count(1)+1);
6=2+2^2(pop_count(6)=pop_count(2)+1);
7=3+2^2(pop_count(7)=pop_count(3)+1)
8=0+2^3(pop_count(8)=pop_count(0)+1)
i+b=i+2^b(ans[i+b]=ans[i]+1);
[0,0) 推導出 [0,1) 推導出 [0,3) 推導出[0,7) 推導出...
代碼實現:
public int[] countBit(int num)
{
int [] ans=new int [num+1];
int i=0,b=1;
while(b<=num)
{
while(i<b&&i+b<=num)
{
ans[i+b]=ans[i]+1;
++i;
}
i=0;
b=b<<1;
}
return ans;
}
實現結果:
public static void main(String args[])
{
int ac[]=count_bit(3);
for(int i=0;i<ac.length;i++)
System.out.println(ac[i]);
}
四、漢明距離
題目描述:兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。
給出兩個整數 x
和 y
,計算它們之間的漢明距離。
思想:
就是計算x^y中的1中的個數
代碼實現:
public int hammingDistance(int x, int y)
{
int i = x ^ y;
int count = 0;
while (i != 0) {
if ((i & 1) == 1) //消除最後一位1
{
count++;
}
i = i >> 1;//右移
}
return count;
}
五、交替二進制數
題目描述:給定一個正整數,檢查他是否爲交替位二進制數:換句話說,就是他的二進制數相鄰的兩個位數永不相等。
思想:保留最後一位,然後右移,再判斷是否相同
代碼實現:
public boolean has_Al(int n)
{ int pre=-100;
boolean is_has=false;
while(n!=0)
{ if(pre!=-100&&pre==(n&1))
{
is_has=false;
break;
}
else
{
pre=n&1;
//判斷最後一位是否爲1
n=n>>1;//清除最後一位
}
}
return is_has;
}
下次再寫