位運算中特別有用的功能

2021-07-28 21:13:34 字數 1396 閱讀 3356

### date: 2017/3/17 

### author: soaringlee

最近在學習和除錯乙個工程專案時,發現很多操作都是通過位運算或者逗號表示式進行實現的。一方面是因為位運算的效率是很高的

位運算是非常迅速的,因為它直接對記憶體中的二進位制資料進行操作。 另一方面,可以對**進行優化,提高效率的的同時,也可以簡化**。

按位運算除了,按位與,按位非,按位左移,按位右移,還有按位異或。

按位異或運算定義,

1 ^ 1=0

1 ^ 0=1

0 ^ 1=1

0 ^ 0=0

異或,就是「相同為0,不同為1」

定理一a ^ b = b ^ a

定理二 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

定理三 a ^ b ^ a = b, a ^ a^ b = b, b ^ a^ a = b

定理四若d = a ^ b ^ c,則a = d ^ b ^ c

證明:在d = a ^ b ^ c兩邊同時異或^ b ^ c,得

d ^ b ^ c =a ^ b ^ c ^ b ^ c

d ^ b ^ c =a ^ b ^ b ^ c ^ c,由定理三得

d ^ b ^ c =a ^ c ^ c,同樣由定理三得

d ^ b ^ c =a

(1) 實現兩個值的交換,而不必使用臨時變數。

例如交換兩個整數a=10100001,b=00000110的值,可通過下列語句實現:

a = a^b;  //a=10100111

b = b^a;  //b=10100001

a = a^b;  //a=00000110

(2) 在組合語言中經常用於將變數置零:

xor   a,a

(3) 使某些特定的位翻轉

例如對數10100001的第2位和第3位翻轉,則可以將該數與00000110進行按位異或運算。

10100001^00000110 = 10100111

(4)使用定理三進行編碼解碼

由b ^ a^ a = b,我們可以假設一聊天記錄是b,金鑰是a。現在b ^ a之後,成了密文了。為了解密,對密文再使用金鑰a進行一次異或運算即可。也即是b ^ a^ a = b。

另外,最近經常用到乙個混合位運算,感覺特別有用:

&~:這個混合位運算可以實現取出最高位和比較的作用。

比如:m&~(m-1):就是取出m的最高位;

if(p&~63) 就等價於if(p>63)。

m&1:可以用來判斷m是奇數還是偶數。if(m&1) 表示如果m是奇數;if(m&1==0)表示如果m是偶數。

好了,今天就總結這麼多了,後續用到比較好的位運算繼續總結在下面,

未完待續。。。。。。

Linux 下幾個特別有用的裝置檔案

原貼 http www.ownlinux.cn 2008 11 13 tips in linux command line 登雲梯於 2008 11 15,21 36 瀏覽 649 正如大家所知道的那樣,linux下的裝置很特別,系統總是以總一的方式讀取裝置,而裝置間的差別由裝置驅動程式來負責完成。...

位運算及常用的功能

注 在涉及到位運算時,一定要注意位運算的優先順序。該加的括號一定要加 在計算機中,cpu只能接受二進位制的資料和指令 接下來就學習一下二進位制的運算 位運算 二進位制的運算有 按位與 按位或 按位異或 按位取反 左移 右移 a b a b a b a b 0 0 0 0 0 0 1 0 1 1 1 ...

Java 中的位運算

移位運算子 包括 右移 左移 無符號右移 例子 5 3 1 1111 1111 1111 1111 1111 1111 1111 1011 1111 1111 1111 1111 1111 1111 1111 1111 其結果與 math.floor double 5 2 2 2 完全相同。5 3 ...