位運算--求一個 數二進位制中1的個數
阿新 • • 發佈:2019-01-08
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;
}