Articulo de referencia

Sistema de numeración binaria sesgado

El sistema de numeración binaria sesgada es un sistema de numeración posicional no estándar en el que el enésimo dígito contribuye con un valor de 2 norte + 1 − 1 {\displaystyle...

El sistema de numeración binaria sesgada es un sistema de numeración posicional no estándar en el que el enésimo dígito contribuye con un valor de2norte+11{\displaystyle 2^{n+1}-1}veces el dígito (los dígitos se indexan desde 0) en lugar de2norte{\displaystyle 2^{n}}veces como en binario . Cada dígito tiene un valor de 0, 1 o 2. Un número puede tener muchas representaciones binarias asimétricas. Por ejemplo, el número decimal 15 se puede escribir como 1000, 201 y 122. Cada número se puede escribir de forma única en forma canónica binaria asimétrica donde solo hay como máximo una instancia del dígito 2, que debe ser el dígito distinto de cero menos significativo . En este caso, 15 se escribe canónicamente como 1000.

Ejemplos

Las representaciones binarias asimétricas canónicas de los números del 0 al 15 se muestran en la siguiente tabla: [ 1 ]

Operaciones aritméticas

La ventaja del binario asimétrico es que cada operación de incremento se puede realizar con como máximo una operación de acarreo . Esto aprovecha el hecho de que2(2norte+11)+1=2norte+21{\displaystyle 2(2^{n+1}-1)+1=2^{n+2}-1}Para incrementar un número binario asimétrico, se establece el único dígito dos en cero y se incrementa el siguiente dígito de cero a uno o de uno a dos. Cuando los números se representan mediante una codificación de longitud variable como listas enlazadas de los dígitos distintos de cero, el incremento y el decremento se pueden realizar en tiempo constante.

Se pueden realizar otras operaciones aritméticas alternando entre la representación binaria sesgada y la representación binaria. [ 2 ]

Conversión entre números decimales y binarios asimétricos

Para convertir un número decimal a un número binario asimétrico, se puede utilizar la siguiente fórmula: [ 3 ]

Caso base :a(0)=0{\displaystyle a(0)=0}

Caso de inducción :a(2norte1+i)=a(i)+10norte1{\displaystyle a(2^{n}-1+i)=a(i)+10^{n-1}}

Límites :0i2norte1,norte1{\displaystyle 0\leq i\leq 2^{n}-1,n\geq 1}

Para convertir un número binario asimétrico a decimal, se puede utilizar la definición de un número binario asimétrico:

S=i=0nortebi(2i+11){\displaystyle S=\sum _{i=0}^{N}b_{i}(2^{i+1}-1)}, dóndebi0,1,2{\displaystyle b_{i}\in {0,1,2}}, st. solo el bit menos significativo (lsb) blsb{\displaystyle b_{lsb}}es 2.

Código C++ para convertir un número decimal a un número binario sesgado.

#include <iostream> #include <cmath> #include <algorithm> #include <iterator>usando el espacio de nombres std ;dp largo [ 10000 ];//Usando la fórmula a(0) = 0; para n >= 1, a(2^n-1+i) = a(i) + 10^(n-1) para 0 <= i <= 2^n-1, //tomado de The On-Line Encyclopedia of Integer Sequences (https://oeis.org/A169683)long convertToSkewbinary ( long decimal ){int maksIndex = 0 ; marcas largas = 1 ; mientras ( maks < decimal ){ maks *= 2 ; maksIndex ++ ; }for ( int j = 1 ; j <= maksIndex ; j ++ ){ long power = pow ( 2 , j ); for ( int i = 0 ; i <= power -1 ; i ++ ) dp [ i + power -1 ] = pow ( 10 , j -1 ) + dp [ i ]; }return dp [ decimal ]; } int main () { std :: fill ( std :: begin ( dp ), std :: end ( dp ), -1 ); dp [ 0 ] = 0 ; // Se puede comparar con los números dados en //https://oeis.org/A169683 for ( int i = 50 ; i < 125 ; i ++ ) { long current = convertToSkewbinary ( i ); cout << current << endl ; }devolver 0 ; }

Código C++ para convertir un número binario sesgado a un número decimal.

#include <iostream> #include <cmath>usando el espacio de nombres std ;// Decimal = (0|1|2)*(2^N+1 -1) + (0|1|2)*(2^(N-1)+1 -1) + ... // + (0|1|2)*(2^(1+1) -1) + (0|1|2)*(2^(0+1) -1) // // Entrada esperada: Un entero/long positivo donde los dígitos son 0, 1 o 2, y el único bit/dígito no cero menos significativo es 2. // long convertToDecimal ( long skewBinary ){int k = 0 ; long decimal = 0 ; while ( skewBinary > 0 ) { int digit = skewBinary % 10 ; skewBinary = ceil ( skewBinary / 10 ); decimal += ( pow ( 2 , k + 1 ) - 1 ) * digit ; k ++ ; } return decimal ; } int main () {int test [] = { 0 , 1 , 2 , 10 , 11 , 12 , 20 , 100 , 101 , 102 , 110 , 111 , 112 , 120 , 200 , 1000 };for ( int i = 0 ; i < sizeof ( test ) / sizeof ( int ); i ++ ) cout << convertToDecimal ( test [ i ]) << endl ;;devolver 0 ; }

De la representación binaria sesgada a la representación binaria

Dado un número binario asimétrico, su valor se puede calcular mediante un bucle, calculando los valores sucesivos de2norte+11{\displaystyle 2^{n+1}-1}y añadiéndolo una o dos veces por cada unonorte{\displaystyle n}de tal manera que elnorte{\displaystyle n}El dígito i es 1 o 2 respectivamente. Ahora se presenta un método más eficiente, con solo representación de bits y una resta.

El número binario asimétrico de la formab0bnorte{\displaystyle b_{0}\dots b_{n}}sin 2 y conmetro{\displaystyle m}1s es igual al número binario0b0bnorte{\displaystyle 0b_{0}\dots b_{n}}menosmetro{\displaystyle m}. Dejarddo{\displaystyle d^{c}}representa el dígitod{\displaystyle d}repetidodo{\displaystyle c}veces. El número binario sesgado de la forma0do021do10b0bnorte{\displaystyle 0^{c_{0}}21^{c_{1}}0b_{0}\dots b_{n}}conmetro{\displaystyle m}1s es igual al número binario0do0+do1+21b0bnorte{\displaystyle 0^{c_{0}+c_{1}+2}1b_{0}\dots b_{n}}menosmetro{\displaystyle m}.

De la representación binaria a la representación binaria sesgada

De forma similar a la sección anterior, el número binariob{\displaystyle b}de la formab0bnorte{\displaystyle b_{0}\dots b_{n}}conmetro{\displaystyle m}1s es igual al número binario sesgadob1bnorte{\displaystyle b_{1}\dots b_{n}}másmetro{\displaystyle m}Tenga en cuenta que, dado que la suma no está definida, añadirmetro{\displaystyle m}corresponde a incrementar el númerometro{\displaystyle m}veces. Sin embargo,metro{\displaystyle m}está acotado por el logaritmo deb{\displaystyle b}y el incremento requiere un tiempo constante. Por lo tanto, la transformación de un número binario en un número binario asimétrico se realiza en un tiempo lineal con respecto a la longitud del número.

Aplicaciones

Los números binarios asimétricos fueron desarrollados por Eugene Myers en 1983 para una estructura de datos puramente funcional que permite las operaciones del tipo de datos abstracto pila y también permite la indexación eficiente en la secuencia de elementos de la pila. [ 4 ] Posteriormente se aplicaron a los montículos binomiales asimétricos , una variante de los montículos binomiales que admiten operaciones de inserción en el peor de los casos en tiempo constante. [ 5 ]

Véase también

Notas

  1. Sloane, N.  J.  A. (ed.). "Secuencia A169683" . La enciclopedia en línea de secuencias de enteros . Fundación OEIS.
  2. Elmasry, Amr; Jensen, Claus; Katajainen, Jyrki (2012). "Dos sistemas numéricos binarios asimétricos y una aplicación" (PDF) . Theory of Computing Systems . 50 : 185–211 . doi : 10.1007/s00224-011-9357-0 . S2CID 253736860 . 
  3. La enciclopedia en línea de secuencias de enteros. "Los números binarios asimétricos canónicos" .
  4. Myers, Eugene W. (1983). "Una pila de acceso aleatorio aplicativa". Information Processing Letters . 17 (5): 241– 248. doi : 10.1016/0020-0190(83)90106-0 . MR 0741239 . 
  5. Brodal, Gerth Stølting; Okasaki, Chris (noviembre de 1996). "Colas de prioridad puramente funcionales óptimas" . Journal of Functional Programming . 6 (6): 839– 857. doi : 10.1017/s095679680000201x .