En realidad, hay una razón matemática razonablemente buena para hacer la replicación de bits:
Primera nota que la cadena de n bits, norte, en realidad representa el valor norte2norte- 1 y queremos producir la cadena de m bits, METRO, dónde n < m y
norte2norte- 1≈METRO2metro- 1
Primero escalamos el numerador y el denominador con
norte. (2norte+ 1 )(2norte- 1 ) (2norte+ 1 )≈METRO2metro- 1
y esto se simplifica a
norte. (2norte+ 1 )22 n- 1≈METRO2metro- 1
En tu caso, n ∈ { 5 , 6 } y m = 8 y podemos "parar" aquí, pero el proceso puede repetirse (ad nauseum), si m >> n.
A continuación hacemos la aproximación ...
norte. (2norte+ 1 )22 n≈METRO2metro
que se simplifica a
norte. (2norte+ 1 )22 n - m≈ M
Tenga en cuenta que norte. (2norte+ 1 ) es equivalente a repetir la cadena de n bits, para crear una cadena de 2 bits, y la división se desvía del 2 n - m LSB para dejar un resultado de M bits.
QED
Por supuesto, el cálculo 'correcto' es METRO= ⌊ ((2metro- 1 ) N2norte- 1+12⌋pero esta aproximación, en general, funciona la mayor parte del tiempo. Por supuesto, hay momentos en que es inexacto, pero IIRC solo por un bit y con poca frecuencia.