1. 程式人生 > >關於如何判斷一個數是否是2的整數次方的問題

關於如何判斷一個數是否是2的整數次方的問題

有這樣的一道題:

有一串奇怪數列如下:1 2 -3 4 -5 -6 -7 8 -9 ...  即從1-n,碰到2的次方倍則顯正,其他則是負數。(2的整次方包括:1,2,4,8,16,32,64,128,....)  現在給你一個n,求出,這個數列的和。

直接來判斷一個數是不是2的整數次方並不好判斷,此時我們可以用位運算來快速解決。

我們把2的整數次方的數化成一個二進位制數,會發現,所有這樣的二進位制數第一個數都是1,後面的數都是0;而2^n-1化成二進位制數第一個數都是0,後面的數都是1。即if((i&(i-1))==0) 若if裡面為真,則i就是2的整數次方。

所以這道可以用下面的程式碼AC:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i,sum=0;
        for(i=1;i<=n;i++)
        {
            if((i&(i-1))==0)
            sum=sum+i;
            else
                sum=sum-i;
        }
        printf("%d\n",sum);
    }
    return 0;
 }