神奇的位操作们

位操作是一种灵活、强大的编程技巧。
最简单的使用场景,是将多个字段压到一个字段中,这样可以使用更少的交互来传递更多的内容。
这在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);
}
//给定一个数,找到下一个离该数最近的2的n次方的数字。常用于设定一个一致性哈希算法的mod的值
int next_power_of_two(int num){
    num--;
    num |= num >> 1;
    num |= num >> 2;
    num |= num >> 4;
    num |= num >> 8;
    num |= num >> 16;
    num++;
return num;
}

//要生成一个环的时候,则可以这样来做:
已知可能有n个对象,我们想要将其围成一个环。
先获得离n最近的大于n的2的次方的数字ring_size,根据上方的方式来获得;
获得ring_mask = ring_size - 1;
然后在添加x到环中(x可以为任何数)时,可以:
ring[x & ring_mask] = n;

你可能感兴趣的:(Coding)