has_zero函数解析

#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) }

static inline unsigned long has_zero(unsigned long a, unsigned long *bits,
				     const struct word_at_a_time *c)
{
	unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits;
	*bits = mask;
	return mask;
}

one_bits对应REPEAT_BYTE(0x01)

high_bits对应REPEAT_BYTE(0x80)

从high_bits看,要想mask非零,((a - c->one_bits) & ~a)最高位为1(以8位来看),a & b的最高位1,a和b的最高位都得为1,所以~a的最高位为1,a的最高位就是0,要想a的最高位从0变为1,只能是减法需要从a的最高位处借1,低7位减1还要向高位借值,低7位只能是全位0,所以a的8位都是0,mask才能非零。

这个函数的功能是判断有无零字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值