Hi,
Ich bin auf der Suche nach einer effizienten Funktion, die Nummer des
höchsten belegten Bits ausgibt (log2), bzw oder die Anzahl an
Vorzeichenbits.
Ist ja prinzipiell das selbe, nur das von der anderen Seite angefangen
wird zu zählen
(einige kennen vielleicht die SIGNBITS - instruktion des Blackfin)
kennt jemand eine schöne kurze tricky methode zur implementierung in C?
Die Referenz-Implementierung ist einfach, aber natürlich sehr
ineffizient.
1 | int16_t signbits(int32_t x)
|
2 | {
|
3 | int32_t t;
|
4 | int32_t c;
|
5 | c = 0;
|
6 | t = x & 0x80000000; //isolate highest bit
|
7 | for(;c<=31;c++){
|
8 | if(t!=(x & 0x80000000))
|
9 | break;
|
10 | x = x<<1;
|
11 | }
|
12 | return (int16_t)(c-1);
|
13 | }
|
beispiel:
0000 0001 1111 0011 -> 7
¯¯¯¯¯¯¯¯
0000 1010 1111 0011 -> 4
¯¯¯¯
1111 1110 1111 0011 -> 7
¯¯¯¯¯¯¯¯
(wobei die Blackfin- SIGNBITS - Instruction eins abzieht)
ob das bit jetzt von oben oder von unten gezählt wird ist mir dabei
egal, lässt sich ja leicht umrechnen.
Gruß,
vlad