The current implementation of bit_ffs_area_at finds the start of every block of 1 bits until it finds a block of sufficient size. If a 32-bit word contains 0x55555555, that means finding the start of each of 16 blocks of 1 bits in looking for a pair of consecutive 1-bits.
The method proposed here preprocesses each 32-bit word to make blocks of 1-bits of insufficient size disappear; the time for that preprocessing is proportional to lg(size). It does not rely on calling other bit_ffs functions to examine data.
The same technique is applied to bit_ffc_area_at.