in reply to Unbelievably slow..

You can do quite a lot better with a properly Perlish version.
my $ans = 0; my $total = 0; my $bit; for my $num (0 .. 16777215) { $bit = 1; $total += $_ ? $bit++ : -$bit++ for unpack("b24", pack "L", $num) =~ /./g; $ans++ unless $total; $total = 0; } print "$ans\n";
$ make t
cc     t.c   -o t
$ time ./t
187692

real    0m3.992s
user    0m3.990s
sys     0m0.000s
$ time perl t.pl 
187692

real    6m54.313s
user    6m53.290s
sys     0m0.510s
Still, obviously, you're never going to get anywhere near the same ballpark as C with Perl code in things as machine-friendly as this.

Makeshifts last the longest.