Sean Anderson veröffentlichte Bit Hacks twiddling der Eric Cole-Algorithmus enthält , die finden eines N - Bit - Integer - v in O ( lg ( N ) ) Operationen mit mehrfach und Nachschlagen.
Der Algorithmus basiert auf einer "magischen" Zahl aus der De Bruijn-Sequenz. Kann jemand grundlegende mathematische Eigenschaften der hier verwendeten Sequenz erklären?
uint32_t v; // find the log base 2 of 32-bit v
int r; // result goes here
static const int MultiplyDeBruijnBitPosition[32] =
{
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
v |= v >> 1; // first round down to one less than a power of 2
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];
nt.number-theory
comp-number-theory
Yury Bayda
quelle
quelle
Antworten:
quelle
Einige Beobachtungen basierend auf schnellen Experimenten (ich hoffe, ich habe diese richtig verstanden):
Es gibt 65536 Ganzzahlen vom Typ X.
Es gibt 4096 Ganzzahlen vom Typ X + Y. Dies sind genau die Ganzzahlen vom Typ X, die mit der Sequenz '0000 ...' beginnen.
Es gibt 256 Ganzzahlen vom Typ X + Y + Z. Dies sind genau die Ganzzahlen vom Typ X, die mit der Sequenz '0000011111 ...' beginnen.
Alle ganzen Zahlen vom Typ Y sind ebenfalls vom Typ X.
Es gibt jedoch auch 768 Ganzzahlen vom Typ Z, die weder vom Typ X noch vom Typ Y sind. Diese beginnen mit '1000011111 ...', '0111100000 ...' oder '1111100000 ...'
quelle
Diese besondere Konstante ist eine De Bruijn-Sequenz mit binärem Alphabet, aber mit einer zusätzlichen Eigenschaft. Ich werde es die 'Marc Dickinson-Eigenschaft' nennen, da der ursprüngliche Algorithmus ohne diese speziellen DB-Sequenzen implementiert werden könnte. Durch Anhängen von 2 zusätzlichen Operationen können wir jede gewöhnliche DB-Sequenz verwenden. Operation: v ^ = (v >> 1); // clr alle Bits außer MSB, die nach der Kaskadierung oder Verschiebung gesetzt wurden.
Wenn Sie auf eine elegante mathematische Formel hoffen würden, um sie zu beschreiben, oder auf einen Satz, um sie oder ähnliches zu erzeugen, würde dies meiner Meinung nach einen tiefen Einblick in die Zahlentheorie und möglicherweise in andere Bereiche erfordern, die über meine Fähigkeiten hinausgehen. Wenn ich eine wilde Vermutung anstellen sollte, würde ich wetten, dass sie von zellulären Automaten erzeugt werden könnten. Dies ist keine Antwort warum? auf einer rigorosen Basis, aber ein Versuch, intuitiv zu verstehen, warum es funktioniert und warum es richtig funktioniert, damit Sie es mit Zuversicht verwenden können.
quelle