位操作是一種靈活、強大的程式設計技巧。
最簡單的使用場景,是將多個欄位壓到乙個欄位中,這樣可以使用更少的互動來傳遞更多的內容。
這在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位...