4-Bit Leftshift

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.

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:
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?
Jap. "!=" wird vor "&" ausgewertet.
Die Reihenfolge kann man sich z.B im Standard/A.2 (Seite ~400) www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ansehen.
Aber auch dieses Bild:
Operator precedence table for the C programming language - Stack Overflow
schaut ganz ok aus.
Die Lösung:
count & 3 != 0 zu (count & 3) != 0 umschreiben ;)
 
Zurück
Oben