位運算--求一個 數二進位制中1的個數

gogogo_sky發表於2017-05-10

1.五種位運算:

(1)&(與)–有0則0;無0則1;
(2)|(或)–有1則1,無1則0;
(3)^(亦或)–相同為0,不同為1;
(4)>>右移(最右邊的位被拋棄)
正數,最左邊添0;00001010>>3=00000001
負數,最左邊添1;10001010>>3=11110001
(5)<<左移(最左邊的位被拋棄)–最右邊統一添0;
(正數)00001010<<3=01010000
(負數)10001010<<3=01010000
2.求一個 數二進位制中1的個數:
這裡寫圖片描述
方法1:
//迴圈32次

#include<iostream>

using namespace std;
int NumberOf1(int n)//有符號的n
{
    int count=0;
    int flag=1;
    while (flag)
    {
        if (n&flag)
        {
            count++;
        }
        flag=flag<<1;//左移一位
    }  
    return count;
}
int main()
{
    cout<<NumberOf1(9)<<endl;//1001
    cout<<NumberOf1(15)<<endl;//1111
    return 0;
}

方法2:
//迴圈1的個數次

#include<iostream>

using namespace std;
int NemberOf1(int n)
{
    int count =0;
    while (n)
    {
       count++;
       n=n&(n-1);
    }
    return count;
}
int main()
{
    cout<<NemberOf1(9)<<endl;//1001
    cout<<NemberOf1(15)<<endl;//1111
    return 0;
}

測試:

int main()
{
    cout<<NumberOf1(1)<<endl;
    cout<<NumberOf1(9)<<endl;
    cout<<NumberOf1(0x7FFFFFFF)<<endl;

    cout<<NumberOf1(0)<<endl;

    cout<<NumberOf1(0x80000000)<<endl;
    cout<<NumberOf1(0x80000007)<<endl;
    cout<<NumberOf1(0xFFFFFFFF)<<endl;
    return 0;
}

3.判斷一個整數是不是2的整數次方
分析:一個整數如果是2的正數次方,那麼這個正數的二進位制位中只有一個1;
只需要一句語句就可以判斷:假設這個正數為n:只需判斷n&(n-1)是否為0;

#include<iostream>
using namespace std;
bool fun(int n)
{
    if (n&n-1)
    {
        return false;
    }
    return true;
}
int main()
{
    cout<<fun(1)<<endl;
    cout<<fun(2)<<endl;
    cout<<fun(8)<<endl;
    cout<<fun(10)<<endl;
    return 0;
}

4.輸入兩個整數m和n,計算需要改變m二進位制中的多少位才能得到n;
如:10:1010;13:1101,則需要改變10的二進位制的後三位才能得到1101;

#include<iostream>

using namespace std;
int ChangeBit(int m,int n)
{
    int count=0;
    int k=0;
    k=m^n;//兩個數按位亦或,相同的位全變為0;不同的位全變為1;不同的位就是要改變的數位
    while (k)//求按位亦或結果二進位制位中1的個數
    {
        count++;
        k=k&(k-1);
    }
    return count;
}
int main()
{
    cout<<ChangeBit(10,13)<<endl;
    cout<<ChangeBit(0xFFFFFFFF,0x80000000)<<endl;
    return 0;
}

相關文章