o que é has_zero e find_zero em word_at_a_time.h usado para

No kernel do linux, inlucde / linux / word_at_a_time.h, existem duas funções:

static inline long find_zero(unsigned long mask)
{
        long byte = 0;
#ifdef CONFIG_64BIT
        if (mask >> 32)
                mask >>= 32;
        else
                byte = 4;
#endif
        if (mask >> 16)
                mask >>= 16;    
        else
                byte += 2;
        return (mask >> 8) ? byte : byte + 1;
}

static inline bool has_zero(unsigned long val, 
                            unsigned long *data, 
                            const struct word_at_a_time *c)
{
        unsigned long rhs = val | c->low_bits;
        *data = rhs;
        return (val + c->high_bits) & ~rhs;
}

É usado em uma função hash, no log git ele diz:

 - has_zero(): take a word, and determine if it has a zero byte in it.
   It gets the word, the pointer to the constant pool, and a pointer to
   an intermediate "data" field it can set.

Mas eu ainda não entendi

(1) O que esta função faz ?, e
(2) Como eles fazem isso?

questionAnswers(3)

yourAnswerToTheQuestion