Zet Array cijfers achter de komma aan een matrix van binaire cijfers

stemmen
2

Dit is waarschijnlijk een heel exotische vraag.

Mijn probleem is als volgt:

De TI-83 + grafische rekenmachine kunt u programmeren op met behulp van vergadering en een link-kabel op een computer of de ingebouwde TI-programmeertaal BASIC.

Volgens wat ik heb gevonden, ondersteunt alleen 16-bits gehele getallen en enkele geëmuleerde praalwagens.

Ik wil werken met een beetje grotere aantallen echter (ongeveer 64 bit), dus voor dat ik een array met de enkele cijfers te gebruiken:

{1, 2, 3, 4, 5}

zou de decimale 12345 zijn.

In binaire, dat 110000 00111001, of een binaire waarde array:

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

die zou worden hoe de calculator geeft deze weer.

Hoe zou ik gaan over het converteren van deze array van decimale cijfers (die te groot is voor de calculator weer te geven als een native type) in een array van decimale cijfers?

Efficiëntie is geen probleem. Dit is geen huiswerk.

Dit zou me vrij om Toevoeging van dergelijke arrays en dergelijke uit te voeren vertrekken.

bedankt!

De vraag is gesteld op 01/11/2009 om 13:10
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

Het belangrijkste probleem hier is dat je gaat tussen bases die niet veelvouden van elkaar, en er is dus geen directe geïsoleerde mapping tussen input cijfers en output cijfers. Je bent waarschijnlijk zullen moeten om te beginnen met de minst significante cijfer, uitgevoerd als veel van de minst significante cijfers van de output als je kunt voordat je nodig hebt om het volgende cijfer te raadplegen, en ga zo maar door. Op die manier hoeft u alleen maar ten hoogste 2 van uw input cijfers hebben op een bepaald punt in de tijd wordt onderzocht.

Misschien vindt u het voordeel in termen van verwerking Om uw nummers op te slaan in omgekeerde vorm (zodanig dat de minst significante cijfers komt het eerst in de matrix).

antwoordde op 01/11/2009 om 13:19
bron van user

stemmen
1

Over nagedacht en ik denk dat ik het zou doen aan de volgende 'algoritme'

  • Controleer het laatste cijfer (5 in het voorbeeld geval)
  • indien oneven, opslag (de omgekeerde volgorde) van een 1 in het binaire stelsel

  • Deel nu het nummer 2 via de volgende werkwijze:

  • beginnen met het eerste cijfer en duidelijk de variabele 'dragen'.
  • delen door 2 en voeg de variabele 'dragen'. Als de rest is 1 (controleer dit voordat u de kloof met een en & 1 te doen) zet dan 5 in de carry
  • herhalen totdat alle cijfers zijn gedaan

Herhaal beide stappen weer tot het hele nummer wordt gereduceerd tot 0's.

het nummer in uw binaire array de binaire representatie

uw voorbeeld: 1,2,3,4,5

  • 5 de oneven dus opslaan 1 in het binaire stelsel: 1
  • We verdelen de array 2 met behulp van het algoritme:
  • 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

en herhaal:

0,6,1,7,2 laatste cijfer is zelfs zo dat we slaan een 0: 0,1 (kennisgeving vullen we de binaire tekenreeks van rechts naar links)

enz

je uiteindelijk met een binaire

EDIT: Gewoon om boven te verduidelijken: Alles wat ik doe is de eeuwenoude algoritme:

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

behalve in uw voorbeeld hebben we niet een int, maar een array die een (10 base) vertegenwoordigt int; ^)

antwoordde op 01/11/2009 om 14:02
bron van user

stemmen
0

Op manier zou zijn om elk cijfer in het decimale vertegenwoordiging bij het binaire weergave en voeg de binaire representaties van alle cijfers:

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

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

Proof of concept in C #:

Werkwijzen voor het omzetten van een reeks van binaire waarden, het toevoegen arrays en een matrix vermenigvuldigen met tien:

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;
}

Het omzetten van een array:

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()
);

Output:

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

Edit:
Toegevoegd methoden om een array te vermenigvuldigen met tientallen. Intead van het cijfer voor het omzetten naar een binaire reeks te vermenigvuldigen, het moet worden gedaan om de matrix.

antwoordde op 01/11/2009 om 14:23
bron van user

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