二進位制與bitset

2021-08-21 12:58:20 字數 1896 閱讀 8800

運算子

與(&)(and):1&1=1 0&1=0 1&0=0 0&0=0

或(|)(or):1|1=1 0|1=1 1|0=1 0|0=0

異或(^)(xor):1^1=0 0^1=1 1^0=1 0^0=0

非(!)(not): !1=0 !0=1

邏輯移位

邏輯左移

x<<y 把x的每個二進位制位向左移動y位,移動造成的最右邊空位由0補足,最左邊的數溢位。

邏輯右移

x>>y 把x的每個二進位制位向右移動y位,移動造成的最左邊空位由0補足,最右邊的數溢位。

eg:1<<1=2,2>>1=1,3>>1=1,5<<2=20

所以,對於x,y,左移等於x乘上2^y(x<<y),右移相當於x除上2^y並向下取整(x>>y).

運算優先順序

對於這種東西,記住很難,所以,多打括號吧!,借用學長的一句話:「多加幾個括號累不死你,但是少加幾個括號有可能會哭死在大街上。」

下面來說兩道例題

1.給你n個數,其中有且僅有乙個數出現了奇數次,其餘的數出現了偶數次,讓你輸出這個出現了奇數次的數。這題卡空間,同時只能存兩個數。

2.給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數出現了偶數次,讓你輸出這兩個出現了奇數次的數。

對於第一道題,根據xor的性質,我們可知乙個數xor他自己等於0,所以初始ans=0,在讀入後不斷將其與ans xor,最後的ans即為答案。

對於第二道題,我們可以按照第一題的思路,將其xor,然後可得到一段二進位製碼,因為這兩個數不相等,所以異或後的值(k)不為0。我們隨便找出來k二進位制表示下為1的一位。按照這位是0/1 分成兩類,對每一類分別使用上一題的演算法。

什麼是bitset

通俗來說就是一串只能表示01的陣列(類似於二進位制)。對於訪問,和vector的元素一樣,bitset中的位是沒有命名的,我們只能按位置來訪問它們。

標頭檔案宣告

#include

using

namespace

std;

宣告
bitset

a/*建立乙個長度為n的01陣列。

注意,n為確定值,且初始時每一位都是0。

初始位置是0,也就是說,a[5]是非法訪問。*/

常用函式
b[x]             //訪問b中在x處的二進位制位

b.count() //b中置為1的二進位制位的個數

b.size() //b中二進位制位的個數

b.set() //把b中所有二進位制位都置為1

b.set(x) //把b中在x處的二進位制位置為1

b.reset() //把b中所有二進位制位都置為0

b.reset(x) //把b中在x處的二進位制位置為0

b.flip() //把b中所有二進位制位逐位取反

b.flip(x) //把b中在x處的二進位制位取反

這就是bitset的常用函式,對於不常用和稀奇古怪的函式,可以訪問cpulspuls進行查詢。

一道例題

noi2014起床困難綜合症

題解

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

POJ 2443(二進位制壓縮 bitset)

2015 01 18 15 48 24 思路 用1000 10000的01矩陣來表示數是否存在。直接用陣列顯然存不下,那麼考慮用30 個int型數去存每一列,以其二進位制位來表示0 1,31 33 1000,最多用33個整數即可,將時間和空間複雜度將為33 10000。用bitset實現 1 inc...

JAVA與二進位制

system.out.println 51 7 如上 的結果是 3 答案 00000000 00000000 00000000 00110011 00000000 00000000 00000000 00000111 2進製 計算機內部 只有 2進製資料。任何資訊都必須轉換為2進製,再由計算機處理。...