神奇的位操作们

位操作是一种灵活、强大的编程技巧。
最简单的使用场景,是将多个字段压到一个字段中,这样可以使用更少的交互来传递更多的内容。
这在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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值