一些異或運算以及掩碼的奇技淫巧

2022-07-19 01:36:11 字數 1788 閱讀 4008

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

一些談話的技巧 絕非奇技淫巧

要是你以為單憑熟練的技能和辛勤的工作就能在職場上出人頭地,那你就有點無知了。當然,才幹加上超時加班固然很重要,但懂得在關鍵時刻說適當的話,那也是成功與否的決定性因素。卓越的說話技巧,譬如討好重要人,更能讓你名利雙收。牢記以下十個句型,並在適當時刻派上用場,加薪與公升職必然離你不遠。雖然公升職,加薪是...