Konwersja Array Cyfry dziesiętne do tablicy cyfr binarnych

głosy
2

Prawdopodobnie jest to dość egzotyczne pytanie.

Mój problem jest następujący:

TI 83+ kalkulator graficzny pozwala zaprogramować na nim przy użyciu zespołu oraz link kabel do komputera lub jego wbudowany w TI-BASIC języku programowania.

Zgodnie z tym co znalazłem, to obsługuje liczb całkowitych tylko 16-bitowe i pewne emulowane pływaków.

Chcę pracować z nieco większymi liczbami jednakże (około 64-bitowy), więc za to używać tablicę z pojedynczych cyfr:

{1, 2, 3, 4, 5}

byłoby po przecinku 12345.

W systemie binarnym, to 110000 00111001 lub w postaci binarnej cyfrowej tablicy:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

co byłoby jak kalkulator wyświetla je.

Jak bym go o przekształcenie tej tablicy cyfr po przecinku (który jest zbyt duży dla kalkulator aby wyświetlić go jako natywny typ) do tablicy cyfr po przecinku?

Wydajność nie jest problemem. To nie jest praca domowa.

To byłoby mi zostawić wolne wdrożyć dodatek dla takich tablic i takie.

dzięki!

Utwórz 01/11/2009 o 13:10
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Głównym problemem jest to, że idziesz między zasadami, które nie są wielokrotnością siebie, a tym samym nie jest bezpośrednim izolowane mapowania pomiędzy cyframi wejściowych i wyjściowych cyfr. Jesteś prawdopodobnie będzie musiał zacząć od najmniej znaczącej cyfry, wyjścia tyle najmniej znaczące cyfry wyjścia, jak można przed musisz zapoznać się z następną cyfrę, i tak dalej. W ten sposób wystarczy tylko mieć co najwyżej 2 swoich cyfr wejściowych badane w danym momencie.

Może okazać się korzystne z punktu widzenia celu przetwarzania do przechowywania numerów w formie odwróconej (tak, że najmniej znaczące cyfry na pierwszym miejscu w tablicy).

Odpowiedział 01/11/2009 o 13:19
źródło użytkownik

głosy
1

Myślałem o tym i myślę, że będzie to zrobić za pomocą następującego algorytmu „”

  • sprawdzić ostatnią cyfrę (5 w przykładowym przypadku)
  • Jeśli jest to dziwne, przechowywanie (z odwrotnej kolejności) 1 na tablicy binarnego

  • Teraz podzielić liczbę od 2 do następującej metody:

  • Zaczynamy od pierwszej cyfry i wyzerowanie zmiennej „carry”.
  • podzielić ją przez 2 i dodać zmienną „carry”. Jeśli reszta jest 1 (to sprawdzić, zanim zrobisz z przepaści i & 1), a następnie umieścić 5 w carry
  • powtarzać aż wszystkie cyfry zostały wykonane

powtórzyć oba etapy znowu aż cała liczba jest zredukowana do 0 roku.

numer tablicy w binarnym jest reprezentacja binarna

Twój przykład: 1,2,3,4,5

  • The 5 jest dziwne więc przechowywać w tablicy 1 binarnym: 1
  • Dzieląc tablicę o 2 za pomocą algorytmu:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5 => 0,6,1,2 + 5,5 => 0 6,1,7,2

i powtórz:

0,6,1,7,2 ostatnia cyfra jest nawet więc przechowywać 0: 0,1 (zawiadomienie wypełniamy ciąg binarny od prawej do lewej)

itp

skończyć z binarnym

EDIT: Just do wyjaśnienia powyżej: Wszystko robię jest stary algorytm wiek:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

wyjątkiem w przykładzie nie ma int ale tablicę co stanowi podstawę (10) Int; ^)

Odpowiedział 01/11/2009 o 14:02
źródło użytkownik

głosy
0

Na drodze byłoby przekształcić każdą cyfrę w reprezentacji dziesiętnej to reprezentacja binarna, a następnie dodać binarne reprezentacje wszystkich cyfr:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

Dowód koncepcji w C #:

Metody konwersji do szeregu cyfr binarnych, dodając tablice i pomnożenie przez dziesięć tablicy:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

Konwersja tablicy:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

Wydajność:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

EDIT:
Dodano metody pomnożenie tablicę przez dziesiątki. Intead pomnożenie cyfrę przed przekształceniem go do binarnego tablicy, to musi być zrobione do tablicy.

Odpowiedział 01/11/2009 o 14:23
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more