signbitsfunktion oder log2

OP #1521227
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
OP #1521306
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren