他們是實現它的任何更快的方法,無論它是64位的整數範圍還是任何函數。除了我已經實現的一個。二進制表示中一個數字在奇數和偶數位置的數目是多少?
/*
Find F(i)=abs(a(i)-b(i))
a(i)=number of 1's in even position
b(i)=number of 1's in odd position
for an integer i, where i fits in 64-bit
*/
//function calculate the above equation
//returns the answer
long long int F(long long int k)
{
//size of array is taken for 64-bit number
int a[64]={0},i,a,b;
long long int m;
m=k;
//convert long long int into binary
for(i=63;i>-1;i--)
{
if(m==1||m==0)
{
a[i]=m;
break; //exit the for loop
}
a[i]=m%2; //storing bit by bit
m/=2;
}
// initialized with a value of zero
a=0;
b=0;
//find first bit having 1
int f;
for(i=0;i<64;i++)
{
if(a[i]==1)
{
f=i;
break;
}
}
//calculating the number of 1's in even and odd positions
for(i=f;i<64;i++)
{
if(a[i]==1)
{
if((63-f)%2==0)
{
a++; //1's in even positions
}
else
{
b++; //1's in odd positions
}
}
}
//return the answer
return abs(a-b);
}
所以基本上我所要做的是通過簡單的方法將整數轉換在其二進制表示使用MOD 2.然後,執行任務找到的第1的二進制表示爲從左到右我們的指針在第一個數字上。現在使用前1的索引計算奇數和偶數位置1的數目。最後返回總和偶數和奇數位置1的絕對差值。
一個爲你的網站:https://graphics.stanford.edu/~seander/bithacks.html – Deduplicator 2014-09-12 18:47:32
對於快速實現使用二進制移位操作。 – 2014-09-12 18:58:02
@Learner:這可能會更快一些,但bithacks頁面仍然列出了更好的選項。 – Deduplicator 2014-09-12 19:01:56