Forum: Mikrocontroller und Digitale Elektronik signbitsfunktion oder log2


von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Volker Z. (vza)


Lesenswert?

Da fällt mit nur die "binäre Suche" ein.
Ob sie bei nur 32 iterationen wiklich schneller ist?
Wieviel Millionen mal must du den die Vorzeichenbits bestimmen?

von Vlad T. (vlad_tepesch)


Lesenswert?

glaube ich nicht.
enthält ja auch schleifen und sprünge.

Ich hab gehofft, dass jemand einen ähnlichen trick kennt wie für die 
ones-population-count.
1
unsigned int
2
ones32(register unsigned int x)
3
{
4
        /* 32-bit recursive reduction using SWAR...
5
     but first step is mapping 2-bit values
6
     into sum of 2 1-bit values in sneaky way
7
  */
8
        x -= ((x >> 1) & 0x55555555);
9
        x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
10
        x = (((x >> 4) + x) & 0x0f0f0f0f);
11
        x += (x >> 8);
12
        x += (x >> 16);
13
        return(x & 0x0000003f);
14
}

von Hagen R. (hagen)


Lesenswert?

Jo Assembler Befehle BSR und BSL.

von Vlad T. (vlad_tepesch)


Lesenswert?

lustig, ich hatte grad nach der ones implementierung gesucht, da ich da 
noch ein charakteristisches Bitmuster kannte.

http://aggregate.org/MAGIC/


da gits glaub ich auch das, was ich suche.
Muss ich mir später mal genauer anschauen

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.