1、乙個數和自己做異或的結果是0。如果需要乙個常數0,x86平台的編譯器可能會生成這樣的指令:xorl %eax, %eax
。不管eax
暫存器裡的值原來是多少,做異或運算都能得到0,這條指令比同樣效果的movl $0, %eax
指令快。
2、從異或的真值表可以看出,不管是0還是1,和0做異或值不變,和1做異或得到原值的相反值。可以利用這個特性配合掩碼實現某些位的翻轉,例如:
unsigned int a, b, mask = 1<< 6
;a = 0x12345678
;b = a ^ mask; /*
flip the 6th bit
*/
3、如果a1
^ a2
^ a3
^ ... ^ a
n的結果是1,則表示a1、a
2、a3...a
n之中1的個數為奇數個,否則為偶數個。這條性質可用於奇偶校驗(parity check),
比如在串列埠通訊過程中,每個位元組的資料都計算乙個校驗位,資料和校驗位一起傳送出去,這樣接收方可以根據校驗位粗略地判斷接收到的資料是否有誤。
4、x ^ x ^ y == y,因為x ^ x == 0,0 ^ y == y。這個性質有什麼用呢?我們來看這樣乙個問題:交換兩個變數的值,不得借助於額外的儲存空間,所以就不能採用temp = a; a = b; b = temp;
的辦法了。利用位運算可以這樣做交換:
a = a ^b;b = b ^a;
a = a ^ b;
分析一下這個過程。為了避免混淆,把a和b的初值分別記為a0和b0。第一行,a = a0 ^ b0
;第二行,把a的新值代入,得到b = b0 ^ a0 ^ b0
,等號右邊的b0相當於上面公式中的x,a0相當於y,所以結果為a0;第三行,把a和b的新值代入,得到a = a0 ^ b0 ^ a0
,結果為b0。
如果要對乙個整數中的某些位進行操作,怎樣表示這些位在整數中的位置呢?可以用掩碼(mask)來表示,比如掩碼0x0000ff00表示對乙個32位整數的8~15位進行操作,舉例如下。
1、取出8~15位。
unsigned int a, b, mask = 0x0000ff00;a = 0x12345678
;b = (a & mask) >> 8; /*
0x00000056
*/
這樣也可以達到同樣的效果:
b = (a >> 8) & ~(~0<< 8);
2、將8~15位清0。
unsigned int a, b, mask = 0x0000ff00;a = 0x12345678
;b = a & ~mask; /*
0x12340078
*/
3、將8~15位置1。
unsigned int a, b, mask = 0x0000ff00;a = 0x12345678
;b = a | mask; /*
0x1234ff78
*/
Puppet的一些奇技淫巧
puppet這個工具真的很神奇,先不說商業版有哪些黑科技,單是開源版本就有很多可能讓你摸不著頭腦的地方,下面來列舉一下puppet是怎麼查詢puppet server的 其實很簡單,puppet agent只要知道puppet是什麼就可以了,你可以將 puppet 寫在 etc hosts裡,比如 ...
JS陣列一些奇技淫巧 全
js陣列有許多暴露了api,作為使用者,不僅要會用還要熟練,下面給大家帶來億點點api以及使用技巧供各位嫖客 我也是?享用。先來個資料備忘錄怎麼樣 盜竊位址 本文大部分內容是以上位址,當然也有本人的補充 上圖的補充 every,some 返回的是布林值,表示每個都滿足,或者存在滿足 find fin...
一些談話的技巧 絕非奇技淫巧
要是你以為單憑熟練的技能和辛勤的工作就能在職場上出人頭地,那你就有點無知了。當然,才幹加上超時加班固然很重要,但懂得在關鍵時刻說適當的話,那也是成功與否的決定性因素。卓越的說話技巧,譬如討好重要人,更能讓你名利雙收。牢記以下十個句型,並在適當時刻派上用場,加薪與公升職必然離你不遠。雖然公升職,加薪是...