位運算高階

2022-02-15 01:10:26 字數 1939 閱讀 9032

目錄計算

參考文獻

在 m 位二進位制數中,通常稱最低位為 0 位,從右到左以此類推,最高位為 \(m-1\) 位。

當無符號整數 (unsigned) 爆了的時候,它會自動 %,不會爆出負數。

c++ 的十六進製制常常以 「0x」 開頭,「0x」 後面的部分對應具體的十六進製制的數值。當使用 memset 時,memset 只能賦值出 「每 8 位都相同的數」。當需要把乙個陣列中的數值初始化為正無窮時,為了避免加法算術上溢出或者繁瑣的判斷,我們經常用memset(a, 0x3f, sizeof(a))給陣列賦 0x3f 3f 3f 3f 的值來代替。

對於數字 0x3f 3f 3f 3f,它是滿足以下兩個條件的最大整數:

整數的兩倍不超過 0x7f 7f 7f 7f,即 int 能表示的最大正整數。

整數的每 8 位(每個位元組) 都是相同的。

二進位制狀態壓縮,是指將乙個長度為 m 的 bool 陣列用乙個 m 位二進位制整數表示並儲存的方法。利用下列位運算操作可以實現原 bool 陣列中對應下標元素的訪問。

操作運算

取出 n 的第 k 位

( n >> k ) & 1

取出 n 的後 k 位( 0 ~ k-1 位)

n & ( ( 1 << k ) - 1 )

將第 k 位取反,賦值到 n

n = n xor ( 1 << k )

將第 k 位變為 1,賦值到 n

n |= ( 1 << k )

將第 k 位變為 0,賦值到 n

n &= ( ~ ( 1 << k ) )

這種方法運算簡便,比暴力從十進位制算出二進位制的每一位節省了大量的時間和空間。

從高到低排列:

加減

移位

比較大小

按位與

按位異或

按位或

+ , -

<< , >>

> , < , == , !=

&

xor ( c++ ^ )

|

如果不確定優先順序,則可以加一些括號,以保證運算順序的正確性。

lowbit(n)定義為非負整數 n 在二進位制表示下 「最低位的 1 及其後邊所有的 0 構成的數值」。

設 \(n>0\) ,\(n\) 的第 \(k\) 位是 \(1\),第 \(0\) ~ \(k-1\) 位都是 \(0\)。

為了實現 lowbit 運算,先把 \(n\) 取反,此時第 \(k\) 位變為 0, 第 \(0\) ~ \(k-1\) 位都是 1。再令 \(n=n+1\) ,此時因為要進製,第 k 位變為 1 ,第 \(0\) ~ \(k-1\) 位都是 0。

在上面的取反加 1 操作後,\(n\) 的第 \(k+1\) 到最高位恰好與原來相反,所以 \(n ~\& ~(\sim n+1)\) 僅有第 \(k\) 位為 1,其餘位都是 0。而在補碼表示下,\(\sim n = -1-n\),因此:

\[lowbit(n)=n ~\& ~(\sim n+1) = n ~\& ~(-n)

\]配合 hash 代替 \(\log\) 運算,可以使複雜度降低。

const maxn = 1 << 20;

int h[maxn];

for(int i=0; i<=20; ++i)

h[1 << i] = i; //預處理

while(cin >> n) //對多組資料進行求解

puts("");

}

下面這些仙術可以高效計算 lowbit 以及二進位制中 1 的個數。但是,部分競賽禁止使用下劃線開頭的庫函式,所以這些內建函式在競賽裡不要使用。

李煜東 《演算法競賽 高階指南》

edisonba

2021.1.15

大數運算(高精度運算)

給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35 include include include using namespace std typedef long long ll...

演算法競賽高階指南 位運算

四種基本操作 與 或 非 異或 補碼 int 32位,最高位0代表為整數,最高位為1代表負數。x 00000000000000000000 32個0 就是x的補碼。x 1初始化 memset f,0x3f,sizeof f 每個位元組為0x3f,那麼每個int的數為4個位元組,就是0x3f3f3f3...

PHP php位運算及其高階應用

我們之前學過邏輯與 條件1 條件2 當兩邊條件同時成立時候返回1 邏輯或 條件1 條件2 當兩邊條件只要有乙個成立時候返回1 一.按位與 只有對應的兩個二進位制位均為1時候,結果位才會是1,否則為0.舉例 比如9 5,其實就是1001 101 1,因此9 5 1 計算過程 1001 0101 000...