1. 程式人生 > >找出二進位制表示中1的個數相同,且大小最接近的那兩個數

找出二進位制表示中1的個數相同,且大小最接近的那兩個數

public int getNext(int n)
{
/*
計算c0和c1
*/
int c=n;
int c0=0;
int c1=0;
while(((c&1)==0) && (c!=0))
{
c0++;
c>>=1;
}
while((c&1)==1)
{
c1++;
c>>=1;
}
/*
* 錯誤:若n==1111....1111000....00,那麼就沒有更大的數字
*/
if(c0+c1==31||c0+c1==0)
{
return -1;
}
int p=c0+c1;//最右邊,非拖尾0的位置
n|=(1<<p);//翻轉最右邊,非拖尾0
n&=~((1<<p)-1);//將p右方的所有位清零
n|=(1<<(c1-1))-1;//將右方插入(c1-1)個1
return n;
}