| Reihenfolge bits invertieren < Assembler < Programmiersprachen < Praxis < Informatik < Vorhilfe 
 
 
  |  |  
  | 
    
     |  | Status: | (Frage) beantwortet   |   | Datum: | 18:16 Do 05.07.2012 |   | Autor: | Basser92 | 
 
 | Aufgabe |  | Gegeben sei der Wert a im Register $1. Invertieren Sie die Reihenfolge der Bits in a, so dass [mm] a'_{i}=a_{31-i} [/mm] für [mm] 0\le i\le [/mm] 31. Hinweis: Die Musterlösung kommt mit 35 Befehlen aus und enthält keine Verzweigungen, es ist jedoch nicht erforderlich, dass SIe ihren Algorithmus optimieren.
 | 
 Wie geht sowas? Kann ich das einfach über eine Maske machen, bei der immer nur 1 Bit den Wert 1 hat und dann jeweils das Register $1 mit der Maske AND verknüpfen und die Ergebnisse aufaddieren?
 
 
 |  |  |  | 
 
  |  |  
  | 
    
     |  | Status: | (Antwort) fertig   |   | Datum: | 08:30 Fr 06.07.2012 |   | Autor: | rainerS | 
 Hallo!
 
 > Gegeben sei der Wert a im Register $1. Invertieren Sie die
 > Reihenfolge der Bits in a, so dass [mm]a'_{i}=a_{31-i}[/mm] für
 > [mm]0\le i\le[/mm] 31.
 >  Hinweis: Die Musterlösung kommt mit 35 Befehlen aus und
 > enthält keine Verzweigungen, es ist jedoch nicht
 > erforderlich, dass SIe ihren Algorithmus optimieren.
 >  Wie geht sowas? Kann ich das einfach über eine Maske
 > machen, bei der immer nur 1 Bit den Wert 1 hat und dann
 > jeweils das Register $1 mit der Maske AND verknüpfen und
 > die Ergebnisse aufaddieren?
 
 Im Prinzip ja. Statt der Addtion könntest du auch mit OR verknüpfen. Schreib das doch mal im Detail auf!
 
 Viele Grüße
 Rainer
 
 
 |  |  | 
 |  | 
 
  |  |  
  | 
    
     | Mein Algorithmus sieht so aus:
 
 # Maske erzeugen
 lui $2, 0x0001
 srl $2, $2, 16
 # Laufvariable gleich 31 setzen
 addi $5, $0, 31
 # Zwischenergebnis gleich 0 setzen
 add $4, $0, $0
 # letzte 16 bit bitweise verschieben
 E: beq $5, 1, F
 and $3, $1, $2
 sllv $3, $3, $5
 or $4, $4, $3
 # Maske um 1 Bit verschieben
 sll $2, $2, 1
 # Laufvariable ändern
 subi $5, $5, 2
 jump E
 # erste 16 bit bitweise verschieben
 F: beq $5, 31, G
 and $3, $1, $2
 srlv $3, $3, $5
 or $4, $4, $3
 # Maske um 1 Bit verschieben
 sll $2, $2, 1
 # Laufvariable ändern
 addi $5, $5, 2
 jump F
 # Ergebnis wieder in $1 speichern
 F: add $1, $0, $4
 
 So müsste es doch eigentlich funktionieren, oder?
 
 
 |  |  | 
 |  | 
 
  |  |  
  | 
    
     |  | Status: | (Mitteilung) Reaktion unnötig   |   | Datum: | 10:20 So 08.07.2012 |   | Autor: | matux | 
 $MATUXTEXT(ueberfaellige_frage)
 
 |  |  | 
 
 
 |