### 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 ...