1. 判斷偶數,判斷最低位是0還是1即可,?求模快
????????x % 2 != 0 //x正負都可以判斷;不?x%2 == 1,因為如果x為負奇數,x%2=-1
????????(x & 0x1) == 0
????????例如:
????????int x;
????????int main()
????????{
????????? ?cin>>x;
????????? ?if((x & 0x1)==0) cout<<"yes";?
????????? ?else cout<<"no";
????????? ?return 0;
????????}
2.兩個數的交換
????a = a^b;//a變為?個相同為0,相異為1的結果?
????b = a^b;//該結果和b做運算,得到原來的a?
????a = a^b;//該結果和a做運算,得到原來的b
再來個實例說明下以加深印象。int a = 13, b = 6;
????a的?進制為1101(?進制)
????b的?進制為 110(?進制)
????第?步 a^=b a = 1101 ^ 110 = 1011;
????第?步 b^=a b = 110 ^ 1011 = 1101;即b=13
????第三步 a^=b a = 1011 ^ 1101 = 110;即a=6
3.lowbit運算
????lowbit 運算 是位運算中比較重要的運算方式,用于計算一個二進制數最低位的1。
????lowbit 即二進制數最低位1所對應的值。
????如,二進制數 0b01011000最低的 1是在第3位,對應值為0b1000,即8。
??
lowbit運算的實現
一個數的lowbit值,即一個數的最低位,可通過如下操作取出,復雜度為 O(1):
假設原來的數是a,對a取反加1得到~a+1,原數a和~a+1進行位與操作,就得到了lowbit值,即lowbit(a) = a & (~a + 1)。
? ?
當這個數是0,沒有最低位1的時候,結果為0。
因為取反加1就是一個數的相反數的補碼,因為lowbit也寫作?lowbit(a)=a&(-a)
一個數消去它的lowbit位,由上面的lowbit求法,直接減去它的lowbit值即可。
即 a-(a&-a)也可以由a&(a-1)得到
??
4.求整數的?進制表?中1的個數,不??個?個的移位判斷
????#include <bits/stdc++.h>
????using namespace std;
????int x,cnt;
????int main()
????{
????? ?cin>>x;
????? ?while(x!=0)
????? ?{
????? ?cnt++;
????? ?x&=x-1;//將最右邊的1置為0;正負都可計算,負數是按照補碼計算的,最后的符號位也被統計
????? ?}?
????? ?cout<<cnt;
????? ?return 0;
????}
5.判斷一個數是否2的N次?次
????題?要求:??個表達式,判斷?個數X是否是2的N次?,即2,4,8,16……等,要求不可以?循環語句。
????解析:2,4,8,16這樣的數轉化成?進制是10,100,1000,10000。
????如果X減去1后(低?位并且?進制的每?位都是1),這個數與X做與運算,答案若是0,則X是2的N次?。
????所以答案是:!(x&(x-1))
????即可寫成:if?!(x&(x-1)) cout<<"yes"