位運算與bitset

2022-05-01 22:36:15 字數 2036 閱讀 4713

將兩個數轉化為二進位制後,對應的位置上相同即取,通常取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(int

n)

改位

#define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1設定x的從第ith位開始連續k位位bol

int 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 按位與結...