整理-高级位操作

本文用于整理一下C语言中常见的高级位操作用法
持续更新中

判断是否为奇数

判断x是否为奇数

x & 0x1
1为奇数
0为偶数

向上n整除

(x+n) & (n-1)

应用:向上4字节对齐

x = (x+4) & (4-1)

从右往左的第一个bit为1的位清0,用于判断是否为2的幂次方

x & (x-1)
02的幂次方
非0得到的是清除从右往左的第一个bit为1的值,例如:1010100->1010000, 1010101->1010100 

应用1. 计算一个数中bit为1的个数

uint16_t get_bit1_cnt(uint16_t data)
{
	uint16_t n;
	for (n = 0; data; n++)
		data &= (data - 1);
	return n;
}

PS:在GCC中有比这个更高级的操作例如__builtin_popcount 就可以更快的计算bit为1的个数。详细可以百度内建函数(以__builtin_开头的函数)

获取从右往左的第一个1所表示的值

x & (-x)
例如:
1010 1100b 得到的值为 100b 即十进制的4
0101 0000b 得到的值为1 0000b 即十进制的16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值