Si sólo quieres definir tus funciones, y estás escribiendo para un público de lectores humanos, te recomendaría encarecidamente que escribieras de forma sencilla:
Definir las funciones $f$ y $g$ tal que para todo $a\le b$ sostiene que $$f(2^a+2^b)=a \qquad g(2^a+2^b)=b $$ y para cualquier número $n$ es decir no de la forma $2^a+2^b$ tenemos $f(n)=g(n)=0$ .
Estas condiciones obviamente definen $f$ y $g$ de forma única.
Esto es mucho más fácil de entender, y dará al lector una intuición mucho más clara sobre lo que estás haciendo, que tratar de evitar el uso de palabras en inglés. (Intentar deliberadamente evitar las palabras inglesas en la definición casi conduce a una mala exposición matemática).
Si está escribiendo no para un público humano, entonces lo que debe escribir depende fundamentalmente de lo que entenderá el público no humano.
En particular, si está tratando de programar un ordenador para poner en práctica las $f$ y $g$ para ti, no deberías buscar expresiones algebraicas en absoluto. Más bien, explotar el hecho de que hay operaciones que funcionan para este incorporada a las CPUs modernas . En los procesadores x86/x64 están implementados por el BSF
y BSR
instrucciones. Algunos lenguajes de programación las exponen de forma bastante directa, como por ejemplo Long.numberOfLeadingZeros(n)
y Long.numberOfTrailingZeros(n)
en Java -- sólo necesitas un poco de aritmética trivial para convertir el resultado de la primera de ellas a la representación que quieras.