Hey,
ich habe eine Funktion geschrieben. Diese soll in einer Hex-Darstellung die Zahlen einfach nach links verschieben, sodass keine führenden Nullen da sind.
Das Links-verschieben eines Hex lässt sich durch ein Vielfaches von 4 realisieren. Da der Input "count" vorher durch "Count Leading Zeros" initialisiert und dann übergeben wird, möchte ich diesen ausschließlich in dieser Funktion verkleinern, sodass dieser mod 4 = 0 ist. Das möchte ich durch meine while-Schleife realisieren. Das "print_int" gibt mir den "count" vor dem Shiften aus. Die letzte Zeile führt dann den Shift aus.
Nun das Problem. Ich erhalte ausschließlich die Ausgaben "count=14" und "count=27". Keine dieser Zahlen ist modulo 4 null. Wo mache ich denn einen Fehler? Ich dachte, dass ich count lokal reduzieren kann. Gleicher Algorithmus mit "uint32_t counter = count" und jeweils count gegen counter austauschen, liefert die gleichen Ausgaben.
Mache ich hingegen die nächste Operation einfach außerhalb der Funktion, erhalte ich als Ausgabe korrekterweise 8
Kann es sein, dass "count & 3 != 0", also der Operator "!=" sich nicht mit dem vorherigen verträgt? Wie ist in C hier egtl. die Hierarchie? In welcher Reihenfolge werden solche Operatoren ausgeführt?
Ich weiß, dass a & b | c & d == (a&b) | (c&d). Mit mehr habe ich mich noch nicht beschäftigt
Optimierung des fehlerhaften Codes ist übrigens einfach:
ich habe eine Funktion geschrieben. Diese soll in einer Hex-Darstellung die Zahlen einfach nach links verschieben, sodass keine führenden Nullen da sind.
Das Links-verschieben eines Hex lässt sich durch ein Vielfaches von 4 realisieren. Da der Input "count" vorher durch "Count Leading Zeros" initialisiert und dann übergeben wird, möchte ich diesen ausschließlich in dieser Funktion verkleinern, sodass dieser mod 4 = 0 ist. Das möchte ich durch meine while-Schleife realisieren. Das "print_int" gibt mir den "count" vor dem Shiften aus. Die letzte Zeile führt dann den Shift aus.
Code:
void leftshift(uint32_t *elem, uint32_t count)
{
while (count & 3 != 0)//mod 4
{
count -=1;
}
print_int(count);
*elem <<= count;
}
Nun das Problem. Ich erhalte ausschließlich die Ausgaben "count=14" und "count=27". Keine dieser Zahlen ist modulo 4 null. Wo mache ich denn einen Fehler? Ich dachte, dass ich count lokal reduzieren kann. Gleicher Algorithmus mit "uint32_t counter = count" und jeweils count gegen counter austauschen, liefert die gleichen Ausgaben.
Mache ich hingegen die nächste Operation einfach außerhalb der Funktion, erhalte ich als Ausgabe korrekterweise 8
Code:
int i=11;
while( i & 3){
i-=1;
}
print_int(i);
Kann es sein, dass "count & 3 != 0", also der Operator "!=" sich nicht mit dem vorherigen verträgt? Wie ist in C hier egtl. die Hierarchie? In welcher Reihenfolge werden solche Operatoren ausgeführt?
Ich weiß, dass a & b | c & d == (a&b) | (c&d). Mit mehr habe ich mich noch nicht beschäftigt
Optimierung des fehlerhaften Codes ist übrigens einfach:
Code:
count -= (count & 3);
*elem <<= count;
Zuletzt bearbeitet: