One other step more complicated.
For binary forms of size $4$ we have, with $a\in\{0,1\}$ , $b\in\{0,1\}$ , $c\in\{0,1\}$ :
$$
B^3+aB^2+bB+c=X
$$
Trying to solve for $\,B\,$ results in (computer) algebra you don't want to think about. Therefore I've decided to make a graph of the inverse of the polynomial,
which is a zillion times easier than to determine the inverse algebraically.
A few cases are noticed.
$$
\begin{cases}
B = 0 & \Longrightarrow & X = 0,1 \\
B = 1 & \Longrightarrow & X = 1,2,3,4 \\
B = 2 & \Longrightarrow & X = 8,9,10,11,12,13,14,15 \\
B = 3 & \Longrightarrow & X = 27,28,30,31,36,37,39,40
\end{cases}
$$
Continuing from there, the pattern becomes pretty boring.
Extending the method to $\,aB^N+bB^{N-1}+cB^{N-2}+ \cdots + xB^2+yB^1+zB^0=X\,$ seems prohibitive when done algebraically, and not very promising either.
program later;In Pascal, comments are enclosed in curly brackets. The commented for-do loop gives many trivial outcomes. Because of the base $2$ in the first place. And, with a number $X$ every base $B$ with $B=X$ and $B=X-1$ will give rise to a binary, $10$ and $11$ respectively. If we skip these most obvious trivialities, then the output becomes something like this. The first column is the number $X$, the second column is the base $B$ and the last column is the $(0,1)$ representation with base $B$.
function binary(number,base : integer; var S : string) : boolean; var m : integer; bit : byte; OK : boolean; begin m := number; OK := true; S := ''; while not (m = 0) do begin bit := (m mod base); if bit = 1 then S := S + '1'; if bit = 0 then S := S + '0'; m := m div base; if not ((bit=1) or (bit=0)) then OK := false; end; binary := OK; end;
procedure reverse(var S : string); var k,L : integer; c : char; begin L := Length(S); for k := 1 to (L div 2) do begin c := S[k]; S[k] := S[L-k+1]; S[L-k+1] := c; end; end;
procedure for_number(X : integer); var k : integer; S : string; OK : boolean; begin { for k := 2 to X do } for k := 3 to X-2 do begin OK := binary(X,k,S); if OK then begin reverse(S); Writeln(X:5,k:5,S:10); end; end; end;
procedure loop(N : integer); var K : integer; begin for k := 1 to N do begin for_number(k); { Writeln; } end; end;
begin loop(100); end.
9 3 100 10 3 101 12 3 110 13 3 111 16 4 100 17 4 101 20 4 110 21 4 111 25 5 100 26 5 101 27 3 1000 28 3 1001 30 3 1010 30 5 110 31 3 1011 31 5 111 36 3 1100 36 6 100 37 3 1101 37 6 101 39 3 1110 40 3 1111 42 6 110 43 6 111 49 7 100 50 7 101 56 7 110 57 7 111 64 4 1000 64 8 100 65 4 1001 65 8 101 68 4 1010 69 4 1011 72 8 110 73 8 111 80 4 1100 81 3 10000 81 4 1101 81 9 100 82 3 10001 82 9 101 84 3 10010 84 4 1110 85 3 10011 85 4 1111 90 3 10100 90 9 110 91 3 10101 91 9 111 93 3 10110 94 3 10111 100 10 100