位操作是一种灵活、强大的编程技巧。
最简单的使用场景,是将多个字段压到一个字段中,这样可以使用更少的交互来传递更多的内容。
这在LBA编址上很常见,如一个LBA应该编码进去lunId, poolId, 是否压缩,lun中逻辑地址。
也常用在信息收发上:如socket中的包头,将多种信息压缩到一个头中一次收发。
此处需要注意的是位的偏移长度,以及在实现的时候需要注意将每个字段强转为待压字段的长度单位。
还有一些不太常用的但是很有意思的,记录一下,说不定哪天就能提供一个更好的思路:
//返回val中二进制位里1的个数:
int findBitOnesCount(int val){
int cnt = 0;
while(val){
cnt++;
value = value &(value-1);
}
return cnt;
}
//使用一个bitmap来表示是node_id的添加、删除,查询是否在其中:
int node_set;
int add_node_to_node_set(node_set,node_id){
return node_set | (1 << node_id);
}
int remove_node_from_node_set(node_set,node_id){
return node_set & ~(1<<node+id);
}
bool is_node_in_node_set(node_set,node_id){
return ((node_set &(1<<node_id))!=0);
}
来源:CSDN
作者:sinjoywong
链接:https://blog.csdn.net/SinjoyWong/article/details/103671737