在 m 位二進制數中,一般稱最低位爲 0 位,從右到左以此類推,最高位爲 \(m-1\) 位。算法
當無符號整數 (unsigned) 爆了的時候,它會自動 %,不會爆出負數。數組
C++ 的十六進制經常以 「0x」 開頭,「0x」 後面的部分對應具體的十六進制的數值。當使用 memset 時,memset 只能賦值出 「每 8 位都相同的數」。當須要把一個數組中的數值初始化爲正無窮時,爲了不加法算術上溢出或者繁瑣的判斷,咱們常常用 memset(a, 0x3f, sizeof(a))
給數組賦 0x3F 3F 3F 3F 的值來代替。函數
對於數字 0x3F 3F 3F 3F,它是知足如下兩個條件的最大整數:ui
時間複雜度爲 \(O(1)\)編碼
ull mul(ull a,ull b,ull p) { a%=p; b%=p; ull c=(long double) a*b/p; ull x=a*b; ull y=c*p; ll ans=(ll)(x%p)-(ll)(y%p); if(ans<0) ans+=p; return ans; }
時間複雜度爲 \(O(\log_2b)\)spa
ll mul(ll a,ll b,ll p) { ll ans=0; for(;b;b>>=1) { if(b&1) ans=(ans+1)%p; a=a*2%p; } return ans; }
二進制狀態壓縮,是指將一個長度爲 m 的 bool 數組用一個 m 位二進制整數表示並存儲的方法。利用下列位運算操做能夠實現原 bool 數組中對應下標元素的存取。code
操做 | 運算 |
---|---|
取出 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 ) ) |
這種方法運算簡便,比暴力從十進制算出二進制的每一位節省了大量的時間和空間。ci
推薦題目:CSP-S2020 動物園get
從高到低排列:it
加減 | 移位 | 比較大小 | 按位與 | 按位異或 | 按位或 |
---|---|---|---|---|---|
+ , - | << , >> | > , < , == , != | & | 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\),所以:
配合 Hash 代替 \(\log\) 運算,可使複雜度下降。
const maxn = 1 << 20; int H[maxn]; for(int i=0; i<=20; ++i) H[1 << i] = i; //預處理 while(cin >> n) //對多組數據進行求解 { while(n > 0) { cout << H[n & -n] << ' '; n -= n & -n; } puts(""); }
下面這些仙術能夠高效計算 lowbit 以及二進制中 1 的個數。可是,部分競賽禁止 使用下劃線開頭的庫函數,因此這些內置函數在競賽裏不要使用。
返回 \(x\) 的二進制表示下最低位的 1 後面有多少個 0:
int __builtin_ctz (unsigned int x)
long long __builtin_ctzll (unsigned long long x)
返回 \(x\) 的二進制表示下有多少位爲 1:
int __builtin_popcount (unsigned int x)
int __builtin_popcountll (unsigned long long x)
李煜東 《算法競賽 進階指南》
EdisonBa
2021.1.15