signbitsfunktion oder log2

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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.