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 deveces el dígito (los dígitos se indexan desde 0) en lugar deveces 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 quePara 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 :
Caso de inducción :
Límites :
Para convertir un número binario asimétrico a decimal, se puede utilizar la definición de un número binario asimétrico:
, dónde, st. solo el bit menos significativo (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 dey añadiéndolo una o dos veces por cada unode tal manera que elEl 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 formasin 2 y con1s es igual al número binariomenos. Dejarrepresenta el dígitorepetidoveces. El número binario sesgado de la formacon1s es igual al número binariomenos.
De la representación binaria a la representación binaria sesgada
De forma similar a la sección anterior, el número binariode la formacon1s es igual al número binario sesgadomásTenga en cuenta que, dado que la suma no está definida, añadircorresponde a incrementar el númeroveces. Sin embargo,está acotado por el logaritmo dey 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
- ↑ Sloane, N. J. A. (ed.). "Secuencia A169683" . La enciclopedia en línea de secuencias de enteros . Fundación OEIS.
- ↑ 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 .
- ↑ La enciclopedia en línea de secuencias de enteros. "Los números binarios asimétricos canónicos" .
- ↑ 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 .
- ↑ 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 .
- teoría de números
- Programación funcional
- aritmética informática
- Sistemas de numeración posicional no estándar