「位運算」助力高效能開發

2021-10-10 18:01:04 字數 2726 閱讀 5979

符號

描述運算規則

&按位與

2個位都為1,結果為1

|按位或

乙個位為1,結果為1

^按位異或

相同為0,相異為1

~按位取反

1變0,0變1

《左移各二進位全部左移n位,高位丟棄,低位補0

>>n

右移各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)

運算規則:0&0=0 0&1=0 1&1=1

兩位相同為1,否則為0

3 & 5 = 1

3 0000 0011

5 0000 0101

& 0000 0001

用途

如果想將乙個單元清0,即讓這個數的各個位都為0,就讓這個數去與乙個各位都為0的數值按位與。結果為0

舉個例子:

a = 1010 1110. 取 a 的低四位。只需要找乙個 b,把 b 的低四位設定為 1,其餘為 0,即

b = 0000 1111.

& = 0000 1110. 就可以得到 a 的指定部分, 這個過程中b也就是a的(mask)所謂的掩碼。

只要根據末尾是0還是1來判斷是否是奇偶數。

是 0 就是偶數,是 1 就是奇數。因此可以代替if (a % 2) == 0

替換為if(a & 1 == 0)來判斷a是否為偶數。

運算規則:0|0 = 0, 0|1 = 1, 1|1 = 1

只要其中一位是 1, 結果就位 1.

3 | 5 = 7

3 0000 0011

5 0000 0101

| 0000 0111

用途

舉個例子:

a = 1010 1110. 設定 a 的低四位為 1。只需要找乙個 b,把 b 的低四位設定為 1,其餘為 0,即

b = 0000 1111.

| = 1010 1111. 就可以得到按位與後的結果,

運算規則:0 ^ 0 = 0, 0 ^1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

參加元算的倆個數,相同的位為 0,不同的位為 1 ;

異或的幾條性質:

交換律結合律 ( a ^ b ) ^ c == a ^ ( b ^ c )

對於任何數 x,都有 x ^ x = 0,x ^ 0 = x

自反性: a ^ b ^ b = a ^ 0 = a;

用途運算規則:~1 = 0, ~0 = 1

使 a 的最低位為 0,可以表示為:a & ~1。~1 的值為 1111 1111 1111 1110,再按"與"運算,最低位一定為0。因為「 ~」運算子的優先順序比算術運算子、關係運算子、邏輯運算子和其他運算子都高。

使 a 的最低位為 0,可以表示為:a & ~1。~1 的值為 1111 1111 1111 1110,再按"與"運算,最低位一定為 0。因為 「 ~」 運算子的優先順序比算術運算子、關係運算子、邏輯運算子和其他運算子都高。

定義:將乙個數的各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。

例如:a = a >> 2 將 a 的二進位制位右移 2 位,左補 0 或者 左補 1 得看被移數是正還是負。

運算元每右移一位,相當於該數除以 2。

比如有兩個 int 型別變數 x、y,首先要求 x+y 的和,再除以 2,但是有可能 x+y 的結果會超過 int 的最大表示範圍,所以位運算就派上用場啦。

(x & y)+((x ^ y) >> 1);

對於乙個大於0的整數,判斷它是不是2的幾次方

`((x & (x - 1)) == 0) && (x != 0);

求絕對值

int abs( int x )
取模運算,採用位運算實現:

a % (2 ^ n) 等價於 a & (2 ^ n - 1)

乘法運算 採用位運算實現

a * (2 ^ n) 等價於 a << n

除法運算轉化成位運算

a / (2 ^ n) 等價於 a >> n

求相反數

(~x + 1)

a % 2 等價於 a & 1

Postgres10高效能開發(1)索引

text pattern ops,varchar pattern ops和bpchar pattern ops運算子支援按字元比較,而不是預設語言排序規則比較。可以用於btree索引,但只支援等於比較,不再支援範圍查詢 查詢lc collate方法 show lc collate 結構gin索引是一...

Postgres10高效能開發(4)控制解釋計畫

引數 預設值說明 enable bitmapscan on啟用或禁用位圖索引掃瞄 enable gathermerge on啟用或禁用收集合併,併發查詢時會出現收集合併 enable hashagg on啟用或禁用hashaggregate enable hashjoin on啟用或禁用hash j...

Oracle11高效能開發 (5)SQL調優

全表掃瞄select from c fraud detail trowid訪問select from c fraud detail t where rowid 唯一索引掃瞄select from c fraud detail t where t.id 2016fd3b 7aa6 44d0 80f9 ...