首先我們先看看1位數加法, 在不考慮進製得情況下, 如下
1 1 -->0
1 0 –->1
0 0 -->0
0 1 -->1
顯然, 這個運算可以通過異或來得到 a^b
當然, 這是不進製情況. 實際運算我們當然要進製了, 那麼, 考慮一下什麼情況下會進製呢? 如下, 在二進位制得情況下, 只有1和1相加才會進製
1 1 -->1
0 1 -->0
1 0 -->0
0 0 -->0
很顯然了, 當兩個二進位制一位數進行與運算得時候, 會得到哪個進製了 則有a&b
可是有個問題, 假如我得數字是a= 101, b= 001 用與操作
a & b = 001
最後一位是進製了, 可是進製之後應該是010啊, 進製到第二位了啊, 為什麼還在第一位. 怎麼辦呢? 移位運算, 向左移動一位不就可以了啊
(a & b) << 1 = 010
此時, 進製結果和不進製加法已經算出來了, 怎麼得到最終結果呢 兩個相加唄
a = 11
b = 01
(1) 首先進行不進製加法
a ^ b = 10
(2) 獲取進製
(a&b)<<1 = 01 << 1 = 10
這兩個數相加, 不要問我怎麼相加...
a = 10
b = 10
(1) a ^ b = 00
(2) (a & b) << 1 = 100
很明顯了, 出現0了還加啥 最終結果就是110
總結一下, 位運算進行加法運算得時候, 式子是這樣的 a+b = a^b + (a & b) << 1; 當然, 式**現的加法需要遞迴運算, 經過總結, 可以發現, 三位二進位制可以通過3次運算計算出結果. 四位二進位制可以通過4次運算計算出結果
當乘除2的n次冪的時候, 可以進行位運算
假如有數000100
乘以2000100 * 10 = 001000 (右移一位)
乘以4(2的2次冪)
000100 * 100 = 010000 (右移兩位)
總結: 當a*b 且 b=2
n2^n
2n時, a * b = a << n;
同理, 有乘就有除 當a/b 且 b = 2
n2 ^ n
2n時, a / b = a >> n;
取模運算就是算算能不能除進唄, 不能除進剩下得就是結果, 與乘除一樣, 取餘運算, 必須要取餘運算元是2得n次冪
假如對 8 取餘, 結果肯定在1~7之間
假如有 69 對 8 取餘
把69拆成二進位制
01000101
把7拆成二進位制
0111
找一樣得, 就是&運算
01000101 & 0111 = 0101 = 5
69 % 8 = 5;
總結: a % b 且 b = 2
n2^n
2n時 a%b = a & (b - 1);
為啥要用位運算代替取模呢
在hash中查詢key的時候,經常會發現用 取代 先看兩段 吧,jdk6中的hashmap中的indexfor方法 returns index for hash code h.static int indexfor int h,int length redis2.4中的 段 n.size reals...
c 例項總結 位運算代替bool陣列
問題 開發有時會用到多個標誌位,那麼通常如何實現呢?方式1 普通方式,即使用bool陣列 實現方式 define my flag 1 0 二進位制 00000001,16進製制 0x00000001 define my flag2 1 1 二進位制 00000010,16進製制 0x00000002...
位運算 lowbit運算
位運算裡有一種十分基礎的運算 lowbit運算。lowbit n 定義為非負整數n在二進位制表示下 最低為的1及其後邊所有的0 構成的數值。例如n 10的二進位製表 示為 2 1010,則lowbit n 2 2 10。摘自 演算法競賽高階指南 lowbit n 的公式為 lowbit n n n ...