Forum: Mikrocontroller und Digitale Elektronik suche einfacheren Ausdruck


von Bernd S. (mms)


Lesenswert?

Hallo,

weiß jmd. wie man diesen Ausdruck noch weiter vereinfachen kann so dass 
er nicht soviele Steps im Assembler Code beansprucht?
1
for(z=0; z<8; z++)
2
{
3
  for(j=0; j<array_nbr; j++)
4
    out+= ((array[j][5] << (j)) & (1 << (j + z))) >> z; 
5
6
  output[(z+1)] = out;
7
  out = 0; 
8
}

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

von Sven P. (Gast)


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...

von Mark B. (markbrandis)


Lesenswert?

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

1
#include <stdio.h>
2
3
int main()
4
{
5
  unsigned char array = 0x45;
6
  unsigned char output[8];
7
  unsigned char z;
8
9
  printf("array = 0x%x\n", array);  
10
11
  for(z=0; z<8; z++)
12
  {
13
    output[z] = array % 2; /* modulo 2 */
14
    array = array >> 1;    /* Rechtsshift */
15
  }
16
17
  for(z=0; z<8; z++)
18
  {  
19
    printf("output[%d] = %d\n", z, output[z]);
20
  }
21
  return 0;
22
}

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!

von Bernd S. (mms)


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

von Mark B. (markbrandis)


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.

von Bernd S. (mms)


Lesenswert?

1
out = (array[1][1] & 0x01); 
2
out+= (array[2][1] & 0x01) << 1;   
3
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

von Alles und, oder? (Gast)


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;

von Mark B. (markbrandis)


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? :-)

von Roland P. (pram)


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

von Bernd S. (mms)


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.

von Roland P. (pram)


Lesenswert?

Guckst du:
http://books.google.com/books?id=iBNKMspIlqEC&lpg=PP1&dq=Hacker's%20delight%E2%80%8E&hl=de&pg=PA110

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

von Mark B. (markbrandis)


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.

von Bernd S. (mms)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.