regex
is your best friend for these. here's a reasonably fast method not specific to any language (code here is awk
, but concept is very portable):
using regex to generate every bit-string
comboall the way to 2^28
in less than 2.946 secs
if you only need every 2^16
combo, it's less than 0.5 secs
they're all pre-sorted in big-endian
sequential order, in a single string : so just cut out what you need from there.
as you can see from gawk
profiler - it only requires 1 loop per bit-level.
- strip away the
timer()
and printf()
parts and it all boils down to just :
~
1 ____=_=(_<_)(___^=_)
1 __="."
1 gsub(__,"\\&&",____)
15 while (___++<+BITS_NEEDED) {
15 gsub(__,____,_)
15 __=__"."
}
_
using mawk2
#bits : 2 | 0.00260 secs | 4 segs | 8 bitstr-len | 00011011
#bits : 3 | 0.00504 secs | 6 segs | 18 bitstr-len | 000000011100110111
#bits : 4 | 0.00749 secs | 10 segs | 39 bitstr-len | 001001110001111001100001101111
#bits : 5 | 0.00979 secs | 17 segs | 84 bitstr-len | 101110011100001100000011011111
#bits : 6 | 0.01197 secs | 30 segs | 183 bitstr-len | 001100100001101100000110111111
#bits : 7 | 0.01445 secs | 56 segs | 391 bitstr-len | 011000001101011000001110111111
#bits : 8 | 0.01672 secs | 105 segs | 841 bitstr-len | 100001110111110000011101111111
#bits : 9 | 0.01896 secs | 199 segs | 1793 bitstr-len | 001110111111000000111011111111
#bits : 10 | 0.02119 secs | 379 segs | 3788 bitstr-len | 110001111110000001110111111111
#bits : 11 | 0.02348 secs | 724 segs | 7967 bitstr-len | 110011111100000011101111111111
#bits : 12 | 0.02578 secs | 1390 segs | 16684 bitstr-len | 100111111000000111011111111111
#bits : 13 | 0.02896 secs | 2678 segs | 34809 bitstr-len | 001111110000001110111111111111
#bits : 14 | 0.03210 secs | 5171 segs | 72393 bitstr-len | 011111100000011101111111111111
#bits : 15 | 0.03505 secs | 10009 segs | 150142 bitstr-len | 111111000000111011111111111111
#bits : 16 | 0.03781 secs | 19414 segs | 310629 bitstr-len | 111110000001110111111111111111
#bits : 17 | 0.04070 secs | 37723 segs | 641289 bitstr-len | 111100000011101111111111111111
#bits : 18 | 0.04417 secs | 73414 segs | 1321444 bitstr-len | 111000000111011111111111111111
#bits : 19 | 0.04904 secs | 143073 segs | 2718379 bitstr-len | 110000001111011111111111111111
#bits : 20 | 0.05737 secs | 279184 segs | 5583670 bitstr-len | 100100001111011111111111111111
#bits : 21 | 0.07305 secs | 545413 segs | 11453681 bitstr-len | 001000011110111111111111111111
#bits : 22 | 0.09946 secs | 1066640 segs | 23466075 bitstr-len | 010000111101111111111111111111
#bits : 23 | 0.15100 secs | 2087981 segs | 48023565 bitstr-len | 110000111101111111111111111111
#bits : 24 | 0.25276 secs | 4090896 segs | 98181495 bitstr-len | 100001111011111111111111111111
#bits : 25 | 0.45808 secs | 8021635 segs | 200540878 bitstr-len | 100001111011111111111111111111
#bits : 26 | 0.79723 secs | 15741040 segs | 409267048 bitstr-len | 100001111011111111111111111111
#bits : 27 | 1.49781 secs | 30910510 segs | 834583780 bitstr-len | 000011110111111111111111111111
#bits : 28 | 2.91132 secs | 60737902 segs | 1700661245 bitstr-len | 000011110111111111111111111111
( LC_ALL=C mawk2 -v BITS_NEEDED='28' ; ) 2.54s user 0.35s system 98% cpu 2.946 total
CODE, and output using gawk
#bits : 2 | 0.00272 secs | 4 segs | 8 bitstr-len | 00011011
#bits : 3 | 0.00531 secs | 8 segs | 24 bitstr-len | 000001010011100101110111
#bits : 4 | 0.00906 secs | 16 segs | 64 bitstr-len | 001001101010111100110111101111
#bits : 5 | 0.01170 secs | 32 segs | 160 bitstr-len | 110101101111100111011111011111
#bits : 6 | 0.01425 secs | 64 segs | 384 bitstr-len | 111011111100111101111110111111
#bits : 7 | 0.01687 secs | 128 segs | 896 bitstr-len | 111111100111110111111101111111
#bits : 8 | 0.01943 secs | 256 segs | 2048 bitstr-len | 111100111111011111111011111111
#bits : 9 | 0.02203 secs | 512 segs | 4608 bitstr-len | 100111111101111111110111111111
#bits : 10 | 0.02476 secs | 1024 segs | 10240 bitstr-len | 111111110111111111101111111111
#bits : 11 | 0.02799 secs | 2048 segs | 22528 bitstr-len | 111111011111111111011111111111
#bits : 12 | 0.03193 secs | 4096 segs | 49152 bitstr-len | 111101111111111110111111111111
#bits : 13 | 0.03501 secs | 8192 segs | 106496 bitstr-len | 110111111111111101111111111111
#bits : 14 | 0.03909 secs | 16384 segs | 229376 bitstr-len | 011111111111111011111111111111
#bits : 15 | 0.04370 secs | 32768 segs | 491520 bitstr-len | 111111111111110111111111111111
#bits : 16 | 0.04993 secs | 65536 segs | 1048576 bitstr-len | 111111111111101111111111111111
#bits : 17 | 0.05996 secs | 131072 segs | 2228224 bitstr-len | 111111111111011111111111111111
#bits : 18 | 0.07843 secs | 262144 segs | 4718592 bitstr-len | 111111111110111111111111111111
#bits : 19 | 0.11286 secs | 524288 segs | 9961472 bitstr-len | 111111111101111111111111111111
#bits : 20 | 0.17921 secs | 1048576 segs | 20971520 bitstr-len | 111111111011111111111111111111
#bits : 21 | 0.31018 secs | 2097152 segs | 44040192 bitstr-len | 111111110111111111111111111111
# gawk profile, created Thu Jun 2 05:36:49 2022
# BEGIN rule(s)
BEGIN {
1 ____ = _ = "01"
1 __ = "."
1 srand()
1 ______ = timer()
1 gsub(__, "\\&&", ____)
1 ++___
20 while (___++ < +BITS_NEEDED) {
20 gsub(__, ____, _)
20 print sprintf(" #bits : %2.f | %9.5f secs | %10.f segs | %-13.f bitstr-len | %.30s%.0s", ___, (timer() - ______) / (1E6 - 1E-6), (_____ = length(_)) / ___, _____, substr(_, ++_____ - 30), __ = __ ".")
}
}
# Functions, listed alphabetically
21 function timer(_, __)
{
21 return (substr("", (__ = "gdate +'%s%6N'") | getline _, close(__)) _)
}
( LC_ALL=C gawk -p- -v BITS_NEEDED='21' -b -e ; ) 0.26s user 0.04s system 93% cpu 0.321 total