www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik suche einfacheren Ausdruck


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weiß jmd. wie man diesen Ausdruck noch weiter vereinfachen kann so dass 
er nicht soviele Steps im Assembler Code beansprucht?

for(z=0; z<8; z++)
{
  for(j=0; j<array_nbr; j++)
    out+= ((array[j][5] << (j)) & (1 << (j + z))) >> z; 

  output[(z+1)] = out;
  out = 0; 
}

In der Variable array befinden sich Hex-Zahlen - z.B. 0x45; Ziel ist es 
in der Variable output die einzelnen bits nacheinander gespeichert zu 
haben:

ein kleines bsp:
array[1][1] = 0x45 = 01000101

-> dann soll im output

output[0] = 1
output[1] = 0
output[2] = 1
output[3] = 0
output[4] = 0
output[5] = 0
output[6] = 1
output[7] = 0

-> insgesamt hat das array[16][] 16 relevante Werte: mit array[1][1] 
wird die erste Bitstelle von output[] belegt, mit array[2][1] soll die 
zweite Bitstelle usw. belegt werden.

-> d.h. im output[0] hab ich von allen Werten von array[1][1] bis 
array[16][1] die ersten Bits gespeichert!

Gruß
Bernd

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ehrlich gesagt: Du schiebst dir da nen ganz schönen Blödsinn zusammen. 
Bau eine Maske und dann hat sich das.

Naja, auf einem Pentium braucht das aber gar nicht so viele Schritte. 
Wie das bei anderen Prozessoren aussieht (etwa AVR DER IMMER NUR UM EIN 
BIT SCHIEBEN KANN), weiß ich leider nicht...

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht so in der Art? Läuft bei mir aufm PC wunderbar schnell ;-)

#include <stdio.h>

int main()
{
  unsigned char array = 0x45;
  unsigned char output[8];
  unsigned char z;

  printf("array = 0x%x\n", array);  

  for(z=0; z<8; z++)
  {
    output[z] = array % 2; /* modulo 2 */
    array = array >> 1;    /* Rechtsshift */
  }

  for(z=0; z<8; z++)
  {  
    printf("output[%d] = %d\n", z, output[z]);
  }
  return 0;
}


Wobei:
> ein kleines bsp:
> array[1][1] = 0x45 = 01000101
>
> -> dann soll im output
>
> output[0] = 1
> output[1] = 0
> output[2] = 1
> output[3] = 0
> output[4] = 0
> output[5] = 0
> output[6] = 1
> output[7] = 0

widerspricht irgendwie dem hier, oder seh ich das falsch?

> -> insgesamt hat das array[16][] 16 relevante Werte: mit array[1][1]
> wird die erste Bitstelle von output[] belegt, mit array[2][1] soll die
> zweite Bitstelle usw. belegt werden.
>
> -> d.h. im output[0] hab ich von allen Werten von array[1][1] bis
> array[16][1] die ersten Bits gespeichert!

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>widerspricht irgendwie dem hier, oder seh ich das falsch?

nein das sollte meiner erklärung nicht widersprechen.

das array besitzt ja mehrere Werte / insgesamt 16 Stück die für diese 
Berechnung / Rechnung relevant sind.

Vielleicht ein kleines Beispiel mit zwei Array-Werten, dann wird es 
wahrscheinlich noch deutlicher:


array[1][1] = 0x45 = 01000101
array[2][1] = 0x21 = 00100001

-> output

output[0] = 11 (11 = erstes Bit von 0x45 und von 0x21)
output[1] = 00
output[2] = 01
output[3] = 00
output[4] = 00
output[5] = 10
output[6] = 01
output[7] = 00


output[0] etc. besteht am schluss aus 16x dem ersten Bit der 16ten 
array[][] Werten.

Gruß
Bernd

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst also immer das niederste Bit aus 8 Bits haben?

Wert_Niederstes_Bit = Gegebenes_Byte & 0x01;

Ist eine UND-Verknüpfung mit der Bitmaske 0000 0001. Die macht Dir alle 
Bits zu 0, außer eben das Niederste, welches nicht verändert wird, denn 
a AND 1 = a.

Deine Ergebnisworte haben 16 Bits, wobei das erste Bit von 0x45 an der 
Stelle mit der Wertigkeit 2^15 steht, das erste Bit von 0x21 an der 
Stelle mit der Wertigkeit 2^14 usw.
Also praktisch gewichtet aufaddieren um auf die Ergebniszahl zu kommen.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
out = (array[1][1] & 0x01); 
out+= (array[2][1] & 0x01) << 1;   
out+= (array[3][1] & 0x01) << 2;

>Also praktisch gewichtet aufaddieren um auf die Ergebniszahl zu kommen.
wie genau meinst du das? gibt es noch eine andere option als den 
Shift-Operator, um die Bits an die richtige Stelle in der Variable out 
zu verschieben?

Gruß
Bernd

Autor: Alles und, oder? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles Quark, am schnellsten ist:

array = 0x45;
out[0] = array & 1;
array >>= 1;
out[1] = array & 1;
array >>= 1;
out[2] = array & 1;
array >>= 1;
out[3] = array & 1;
array >>= 1;
out[4] = array & 1;
array >>= 1;
out[5] = array & 1;
array >>= 1;
out[6] = array & 1;
array >>= 1;
out[7] = array & 1;

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> wie genau meinst du das? gibt es noch eine andere option als den
> Shift-Operator, um die Bits an die richtige Stelle in der Variable out
> zu verschieben?

Anstatt um n Stellen nach links zu schieben, kann man auch mit 2^n 
multiplizieren ;-)

Alles und, oder? schrieb:
> Alles Quark, am schnellsten ist:

Und im zweiten, dritten, vierten... Durchgang? :-)

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich das sehe (verstehe) hat er ein Array mit 16 Byte = 16*8 bit 
und dieses möchte er in ein weiteres Array mit 8 uInt überführen = 8 * 
16 Byte.

Die Bits sollen dabei um 90 Grad "rotiert" werden.
(Hört sich irgendwie nach Verschlüsselung an)

Hab ich das so richtig verstanden?

Gruß
Roland

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Anstatt um n Stellen nach links zu schieben, kann man auch mit 2^n
>multiplizieren ;-)

ist das eine weniger aufwendige / zeitraubende Methode?


>Die Bits sollen dabei um 90 Grad "rotiert" werden.
>(Hört sich irgendwie nach Verschlüsselung an)

>Hab ich das so richtig verstanden?

ja genau so ist es.

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guckst du:
http://books.google.com/books?id=iBNKMspIlqEC&lpg=...

Ob es weniger Code braucht weiß ich nicht, aber es ist auf jeden fall 
"raffinierter"

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
>>Anstatt um n Stellen nach links zu schieben, kann man auch mit 2^n
>>multiplizieren ;-)
>
> ist das eine weniger aufwendige / zeitraubende Methode?

Nein, der Compiler sollte sogar dasselbe daraus machen ;-)

Und sag doch gleich, dass Du transponieren willst.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und sag doch gleich, dass Du transponieren willst.
sorry, an das hab ich gar nicht gedacht - transponierte Matrix; weil 
verschlüsseln tue ich nichts...

Danke für den Buch-Tipp! Bin gespannt, wie schnell der Code abgearbeitet 
werden kann.

Gruß
Bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.