將兩個數轉化為二進位制後,對應的位置上相同即取,通常取1,所以&通常情況下可以用來列舉子集
設x為表示集合的整數,那麼這個整數有如下性質:
x的子集整數y在數值上不會比x大。因為x的子集y只是保留了x某些位置上的1,所以y總可以加上乙個非負的整數z等於x,相當於把沒選的1補上。
根據這個性質可知,可以通過列舉所有比x小的數p並判斷,p是否只含x對應位上的1,如果是則p是x的子集,否則不是。這樣時間複雜度是嚴格的x。有沒有更快的呢,有的。
上訴列舉p是通過減一操作,並且我們知道減一操作一定是正確的,那麼在列舉的時候如何快速的去掉多餘的狀態,答案就是和x進行&(與)運算。與運算可以快速跳到下乙個子
集。&運算本質就是保留p在x對應位為1的數值,而根據二進位制減法可知減一操作都是把p最低位的1消去,在那一位後全補上1,如果在x對應位為0的地方產生了1其實是無效的,
後續的減一操作也會把它消掉,所以直接&運算可以快速去掉多餘的狀態。時間複雜度是x的子集數。
for(int i=x;i;)i=(i-1)&x;
快速判斷乙個數是不是2的整數冪
bool fun(intn)
改位
#define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1設定x的從第ith位開始連續k位位bolint mset(int x,int ith,int k,int
bol)
兩個相應的二進位制位中只要有乙個為1,該位的結果值為1。所以通常用來求並集
若參加運算的兩個二進位制位值相同則為0,否則為1,常用來取反
交換a,b;
void swap(int &a,int &b)
一元運算子,用於求整數的二進位制反碼,即分別將運算元各二進位制位上的1變為0,0變為1。
左移運算子是用來將乙個數的各二進位制位左移若干位,移動的位數由右運算元指定(右運算元必須是非負 值),其右邊空出的位用0填補,高位左移溢位則捨棄該高位。
右移運算子是用來將乙個數的各二進位制位右移若干位,移動的位數由右運算元指定(右運算元必須是非負
值),移到右端的低位被捨棄,對於無符號數,高位補0。對於有符號數某些機器將對左邊空出的部分用符號位填補(即「算術移位」),而另一些機器則對左邊空出的部分用0填補(即「邏輯移位」)。
bitset 是stl庫中的二進位制容器,根據c++ reference 的說法,bitset可以看作bool陣列,但優化了空間複雜度和時間複雜度,並且可以像整形一樣按位與或。
bitset申明長度
bitsetb;
賦值bitset過載了運算子,可以像陣列一樣使用
b[0]=1;
bit的常用函式
處理的陣列只有0和1的變化,此時就可以使用bitset優化。比如求兩個集合的交集可以使用按位與運算,求並集可以使用按位或運算
b.any() //b中是否存在置為1的二進位制位?
b.none()//
b中不存在置為1的二進位制位嗎?
b.count()//
b中置為1的二進位制位的個數
b.size() //
b中二進位制位數的個數
b[pos] //
訪問b中在pos處二進位制位
b.test(pos)//
b中在pos處的二進位制位置為1麼?
b.set() //
把b中所有二進位制位都置為1
b.set(pos) //
把b中在pos處的二進位制位置為1
b.reset() //
把b中所有二進位制位都置為0
b.reset(pos) //
把b中在pos處的二進位制位置置為0
b.flip() //
把b中所有二進位制位逐位取反
b.flip(pos) //
把b中在pos處的二進位制位取反
b.to_ulong() //
把b中同樣的二進位制位返回乙個unsigned
位運算子與位運算
位運算是對二進位制位的操作,它應用於整形資料,把整形資料看成固定的二進位制序列,然後對二進位制序列進行位運算 按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例c a b a 1010...
進製運算與位運算
不可以在二進位制表示形式中使用負號 5 0000 0101 5 1111 1011 取反加一 既是補碼 負數二進位制的計算方法是把整數二進位制按位求反 再加一 就是補碼 每個有符號資料型別中首位為 1 其它位都是 0 的二進位制表示這個資料型別的最小數 採用剛才的計算方法同樣可以根據負數的二進位制補...
位運算與移位運算
位運算指的是進行二進位制位的運算 位運算子說明 取反 按位與 按位或 按位異或 左移運算子,左移一位等於乘二 右移運算子,右移一位相當於除2取商 按位取反 按位與 按位或 按位異或的 執行操作 int a 7 0111 int b 8 1000 system.out.println a b 按位與結...