# $pre[n] matches any character that ends with exactly n zero bits @pre = map { qr{[@{[chr(1<<(7-$_))]}-@{[chr((1<<(8-$_))-1)]}]} } 0 .. 7; $pre[0] = qr(^|$pre[0]); # $suf[m] matches if we have at least m zero bits following my @suf = ('', #done map { my $m=$_; qr{[@{[join '', map { chr($_<<$m) } 0..((1<<(8-$m))-1)]}]} } 1..7 ); sub zero_bit_regexp { my $N = shift; my $p = join '|', map { qr{$pre[$_]\0{@{[($N-$_)>>3]}}$suf[($N-$_)&0x7]} } 0..7; return qr{$p}; }