目錄計算
參考文獻
在 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...