Jump to content

Косая двоичная система счисления

Косая двоичная система счисления — это нестандартная позиционная система счисления , в которой n -я цифра имеет значение умножить цифру (цифры индексируются с 0) вместо раз, как в двоичном формате . Каждая цифра имеет значение 0, 1 или 2. Число может иметь множество искаженных двоичных представлений. Например, десятичное число 15 может быть записано как 1000, 201 и 122. Каждое число может быть записано однозначно в косой двоичной канонической форме, где существует не более одного экземпляра цифры 2, которая должна быть младшей значащей ненулевой цифрой. В данном случае 15 канонически записывается как 1000.

Канонические асимметричные двоичные представления чисел от 0 до 15 показаны в следующей таблице: [1]

Десятичный Двоичный Перекос двоичного файла тройной
0 0 0 0
1 1 1 1
2 10 2 2
3 11 10 10
4 100 11 11
5 101 12 12
6 110 20 20
7 111 100 21
8 1000 101 22
9 1001 102 100
10 1010 110 101
11 1011 111 102
12 1100 112 110
13 1101 120 111
14 1110 200 112
15 1111 1000 120

Арифметические операции

[ редактировать ]

Преимущество асимметричного двоичного кода заключается в том, что каждую операцию приращения можно выполнить не более чем с одной операцией переноса . Это использует тот факт, что . Увеличение асимметричного двоичного числа осуществляется путем установки только двух цифр на ноль и увеличения следующей цифры от нуля до единицы или от единицы до двух. Когда числа представлены с использованием формы кодирования длин серий в виде связанных списков ненулевых цифр, приращение и уменьшение могут выполняться за постоянное время.

Другие арифметические операции могут выполняться путем переключения между асимметричным двоичным представлением и двоичным представлением. [2]

Преобразование десятичных и асимметричных двоичных чисел

[ редактировать ]

Чтобы преобразовать десятичное число в асимметричное двоичное число, можно использовать следующую формулу: [3]

Базовый случай :

Индукционный случай :

Границы :


Чтобы преобразовать асимметричное двоичное число в десятичное, можно использовать определение асимметричного двоичного числа:

, где , ул. только младший бит (LSB) это 2.

Код C++ для преобразования десятичного числа в искаженное двоичное число

[ редактировать ]
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iterator>

using namespace std;


long dp[10000];

//Using formula a(0) = 0; for n >= 1, a(2^n-1+i) = a(i) + 10^(n-1) for 0 <= i <= 2^n-1,
//taken from The On-Line Encyclopedia of Integer Sequences (https://oeis.org/A169683)

long convertToSkewbinary(long decimal){

 int maksIndex = 0;
 long maks = 1;
 
 while(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;
    
    //One can compare with numbers given in
    //https://oeis.org/A169683
    for(int i = 50; i < 125; i++){
        long current = convertToSkewbinary(i);
        cout << current << endl;
    }

    
	return 0;
}

Код C++ для преобразования асимметричного двоичного числа в десятичное число

[ редактировать ]
#include <iostream>
#include <cmath>


using namespace 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)
//
// Expected input: A positive integer/long where digits are 0,1 or 2, s.t only least significant bit/digit is 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;;

    
	return 0;
}

От асимметричного двоичного представления к двоичному представлению

[ редактировать ]

Учитывая асимметричное двоичное число, его значение можно вычислить с помощью цикла, вычисляя последовательные значения и добавляя его один или два раза для каждого такой, что 1-я цифра — 1 или 2 соответственно. Теперь дан более эффективный метод, использующий только битовое представление и одно вычитание.

Косое двоичное число вида без 2 и с 1с равно двоичному числу минус . Позволять представляет цифру повторенный раз. Косое двоичное число вида с 1с равно двоичному числу минус .

От двоичного представления к искаженному двоичному представлению

[ редактировать ]

Как и в предыдущем разделе, двоичное число формы с 1 с соответствует асимметричному двоичному числу плюс . Обратите внимание: поскольку сложение не определено, добавление соответствует увеличению числа раз. Однако, ограничен логарифмом и приращение занимает постоянное время. Следовательно, преобразование двоичного числа в косое двоичное число происходит во времени, линейном по длине числа.

Приложения

[ редактировать ]

Асимметричные двоичные числа были разработаны Юджином Майерсом в 1983 году для чисто функциональной структуры данных , которая позволяет выполнять операции абстрактного типа данных стека , а также обеспечивает эффективную индексацию последовательности элементов стека. [4] Позже они были применены для перекоса биномиальных куч — варианта биномиальных куч , который поддерживает операции вставки в худшем случае с постоянным временем. [5]

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Слоан, Нью-Джерси (ред.). «Последовательность A169683» . Электронная энциклопедия целочисленных последовательностей . Фонд ОЭИС.
  2. ^ Эльмасри, Амр; Дженсен, Клаус; Катахайнен, Юрки (2012). «Две косо-двоичные системы счисления и одно приложение» (PDF) . Теория вычислительных систем . 50 : 185–211. дои : 10.1007/s00224-011-9357-0 . S2CID   253736860 .
  3. ^ Интернет-энциклопедия целочисленных последовательностей. «Канонические косо-двоичные числа» .
  4. ^ Майерс, Юджин В. (1983). «Прикладной стек произвольного доступа». Письма об обработке информации . 17 (5): 241–248. дои : 10.1016/0020-0190(83)90106-0 . МР   0741239 .
  5. ^ Бродал, Герт Столтинг; Окасаки, Крис (ноябрь 1996 г.). «Оптимальные чисто функциональные очереди с приоритетами» . Журнал функционального программирования . 6 (6): 839–857. дои : 10.1017/s095679680000201x .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f388bc57399097749bb43bf58204f4c0__1721577660
URL1:https://arc.ask3.ru/arc/aa/f3/c0/f388bc57399097749bb43bf58204f4c0.html
Заголовок, (Title) документа по адресу, URL1:
Skew binary number system - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)