c++ primer中介紹bitset時有這麼一句話:「(bitset<32> bitvec)以0位開始的位串是低階位(low-order bit),以31位開始的位串是高階位(high-order bit)。」
以下是摘自一位大神的理解:
計算機裡面的位串有兩種排列順序,即big endian和small endian,也就是你所說的高階位和第階位。舉乙個例子,你可能就明白了。
比如說位串 0101,一共有4位,它的值的十進位制是5。5 = 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0。從左到右,其階依次為3, 2, 1, 0。
如果我們按從左到右的順序把這4個bit放到bitset中(高階放到了低位,低階放到了高位),那就是 bitvec[0] = 0, bitvec[1]=1, bitvec[2]=0, bitvec[3]=1。很明顯,bitvec[3]的階位是0,最低,bitvec[0]的階是3,最高。所謂以xx位開始的,也就是說xx位的階是0。在我們這個例子中,bitvec[3]的階是0,那就是乙個big endian排序。
如果我們按從右到左的順序把這5個bit放到bitset中(低階放到了低位,高階放到了高位),那就是bitvec[0]=1, bitvec[1]=0, bitvec[2]=1, bitvec[3]=0。 也就是說bitvec[0]是其最低階, bitvec[3]是最高端。很明顯我們的0101串應該從bitvec[0]開始, 就是乙個small endian的bit排序。
位運算與bitset
將兩個數轉化為二進位制後,對應的位置上相同即取,通常取1,所以 通常情況下可以用來列舉子集 設x為表示集合的整數,那麼這個整數有如下性質 x的子集整數y在數值上不會比x大。因為x的子集y只是保留了x某些位置上的1,所以y總可以加上乙個非負的整數z等於x,相當於把沒選的1補上。根據這個性質可知,可以通...
關於位運算理解 按位或 按位與 異或
參加運算的兩個數,按二進位制位進行 與 運算 運算規則 只有兩個數的二進位制同時為1,結果才為1,否則為0 負數按補碼形式參加按位與運算 即 0 0 0 0 1 0,1 0 0,1 1 1 例 3 5 即 00000011 00000101 00000001 所以 3 5 的值為1參加運算的兩個數,...
關於負數與位運算
劍指offer上的一道原題,鑽了個牛角尖 求二進位制中1的個數 問題出現在負數,因為要保持負數的性質,所以對負數進行右移操作後將在首位重新補1,若干次右移後將變為0xffffffff.如果要去掉負數的符號位,可以考慮用 int a 127 a a 0x80000000 0x80000000就是32位...