2017-08-08 2 views

Antwort

7

base-4.8.0.0 Da es

countLeadingZeros :: FiniteBits b => b -> Int 
countTrailingZeros :: FiniteBits b => b -> Int 

Diejenigen Indices der höchstwertigen und niedrigstwertigen Bits Satz aus dem Ausgang höchstwertigen und niedrigstwertigen Enden jeweils. Von finiteBitSize :: FiniteBits b => b -> Int subtrahieren, um vom anderen Ende zu zählen.

3

popCount $ x-1 tut dies, effektiv durch Zählen der Anzahl der abschließenden Nullen. Durch Subtrahieren von 1 werden die abschließenden Nullen zu Einsen und setzt die einzige zurück, die vorhanden sein sollte.


Dies ist leicht zu einem allgemeineren Fall ohne die Annahme anzupassen, dass nur ein Bit des Eingangs gesetzt ist: popCount $ complement x .&. (x-1)

Die Hauptidee ist das gleiche, und die Verknüpfung mit dem Komplement von x beseitigt diejenigen, die durch die Subtraktion nicht neu erzeugt werden (welche die einzigen sind, die gezählt werden sollten).

+0

Gibt das nicht das niedrigste Bit zurück. Wie '0011001' wird' 1' zurückgeben. '13' mappt auf' 2'. –

+1

@ WillemVanOnsem "(Angenommen, das Eingangsbit hat gerade 1 Bit gesetzt?)" – leftaroundabout

Verwandte Themen