神奇的位操作們

2021-10-01 16:18:58 字數 1001 閱讀 9954

位操作是一種靈活、強大的程式設計技巧。

最簡單的使用場景,是將多個欄位壓到乙個欄位中,這樣可以使用更少的互動來傳遞更多的內容。

這在lba編址上很常見,如乙個lba應該編碼進去lunid, poolid, 是否壓縮,lun中邏輯位址。

也常用在資訊收發上:如socket中的包頭,將多種資訊壓縮到乙個頭中一次收發。

此處需要注意的是位的偏移長度,以及在實現的時候需要注意將每個欄位強轉為待壓字段的長度單位。

還有一些不太常用的但是很有意思的,記錄一下,說不定哪天就能提供乙個更好的思路:

//返回val中二進位制位裡1的個數:

intfindbitonescount

(int val)

return cnt;

}

//使用乙個bitmap來表示是node_id的新增、刪除,查詢是否在其中:

int node_set;

intadd_node_to_node_set

(node_set,node_id)

intremove_node_from_node_set

(node_set,node_id)

bool is_node_in_node_set

(node_set,node_id)

//給定乙個數,找到下乙個離該數最近的2的n次方的數字。常用於設定乙個一致性雜湊演算法的mod的值

intnext_power_of_two

(int num)

//要生成乙個環的時候,則可以這樣來做:

已知可能有n個物件,我們想要將其圍成乙個環。

先獲得離n最近的大於n的2的次方的數字ring_size,根據上方的方式來獲得;

獲得ring_mask = ring_size -1;

然後在新增x到環中(x可以為任何數)時,可以:

ring[x & ring_mask]

= n;

神奇的位操作符

相信學過c語言的小夥伴們都知道位操作符,正確的使用位操作符會讓我們寫出更高效率的程式 但不要忘記它也是有缺點的 只能用於整型和字元型資料。速度 快於乘法 等同於加減法 參與運算的資料以補碼形式出現!不要弄錯啦!eg 數字 1 原碼 10000000 00000000 00000000 0000000...

神奇的位運算 bitwise trick

在計算機中,資料都以二進位制補碼的形式儲存,根據這一特點,適當採用位運算 bitwise operation 可以很巧妙地解決問題,同時運算效率更高。時刻牢記,最大的負數是 1,在計算機中,它的儲存形式是全1。左移相當於乘以2,友誼相當於除以2.在計算機中,位運算比乘法 除法運算要快得多,所以適當採...

位運算的神奇用法

按位與如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1 左移用來將乙個數的各二進位制位全部左移n位...