#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才能非零。
这个函数的功能是判断有无零字节。