位運算代替常規運算

2021-09-24 20:43:15 字數 1607 閱讀 9151

首先我們先看看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 ...