Wie berechnet man am schnellsten die Anzahl der Bits, die zum Speichern einer Zahl benötigt werden?

8

Ich versuche einige Pack- und Entpackroutinen zu optimieren. Um das Packen durchzuführen, muss ich die Anzahl der Bits berechnen, die benötigt werden, um ganzzahlige Werte zu speichern. Hier ist der aktuelle Code.

%Vor%     
Matt Wamboldt 27.04.2010, 12:46
quelle

6 Antworten

5

Sie suchen nach der Ganzzahl log base 2 einer Zahl (das l = höchste gesetzte Bit). Sean Andersons "Bit Twiddling Hacks" -Seite hat mehrere Methoden, die von den offensichtlichen Zählbits in einer Schleife bis zu Versionen reichen, die eine Tabellensuche verwenden. Beachten Sie, dass die meisten der vorgestellten Methoden etwas modifiziert werden müssen, um mit 64-Bit-Ints zu arbeiten, wenn diese Art der Portabilität für Sie wichtig ist.

Stellen Sie nur sicher, dass jede Verschiebung, die Sie verwenden, um das höchste Bit-Set zu erstellen, auf einer unsigned Version der Zahl ausgeführt werden muss, da eine Compilerimplementierung die Operation >> möglicherweise verlängert oder nicht verlängert ein signierter Wert.

    
Michael Burr 27.04.2010, 14:03
quelle
9

Verwenden Sie nicht portabel den Bit-Scan-Reverse-Opcode, der auf den meisten modernen Architekturen verfügbar ist. Es wird als intrinsisch in Visual C ++ veröffentlicht.

>

Portabel benötigt der Code in der Frage die Edge-Case-Behandlung nicht. Warum benötigen Sie ein Bit für die Speicherung von 0? In jedem Fall werde ich die Ränder des Problems ignorieren. Die Eingeweide können so effizient gemacht werden:

%Vor%     
Marcelo Cantos 27.04.2010 12:49
quelle
5

Was Sie versuchen, ist das wichtigste Bit zu finden. Einige Architekturen haben eine spezielle Anweisung nur für diesen Zweck. Für diejenigen, die dies nicht tun, verwenden Sie eine Tabellen-Lookup-Methode.

Erstellen Sie eine Tabelle mit 256 Einträgen, wobei jedes Element das oberste Bit identifiziert.

Durchlaufen Sie jedes Byte in der Zahl oder verwenden Sie einige if-Anweisungen, um das höchstwertige Nicht-Null-Byte zu finden.

Ich lasse Sie den Rest von hier nehmen.

    
Sparky 27.04.2010 12:59
quelle
3

Führen Sie eine binäre Suche anstelle einer linearen Suche durch.

%Vor%

Wenn Ihre Hardware Bit-Scan-Reverse hat, wäre ein noch schnellerer Ansatz, Ihre Routine in Assembler-Sprache zu schreiben. Um den Code portabel zu halten, können Sie

verwenden %Vor%     
dan04 27.04.2010 13:00
quelle
3

Sie müßten die Ausführungszeit überprüfen, um die Granularität zu bestimmen, aber meine Vermutung ist, dass es 4 Bits gleichzeitig macht und dann wieder auf ein Bit zu einem Zeitpunkt zurückgeht, würde es schneller machen. Protokolloperationen wären wahrscheinlich langsamer als logische / Bit-Operationen.

%Vor%     
Ron 27.04.2010 12:53
quelle
1
%Vor%

auf die höhere Ganzzahl gerundet.

    
tga 27.04.2010 13:11
quelle

Tags und Links