Die Einschränkungen sind sehr seltsam, weil Sie eine effiziente Lösung und Schnitt von nur zwei Mittel wollen, um es richtig zu machen.
Sie wollen also im Grunde x=(2^bit)-1
zu berechnen, die mit Bit-Verschiebung ist recht einfach:
x=(1<<bit)-1; // O(1)
Mit LUT ... auch so, wie dies zu attackieren, ohne dass die beiden:
x=pow(2,bit)-1; //O(?) can be O(1),O(log(n)),O(n)
Nun, das ist weit von effizient und pow
verwendet auch Bit-Shift und einige Implementierung auch LUT. Die einzigen Lösungen links sind:
Annäherung
kann Polynom, PCA verwenden, oder jede andere Methode ... aber Sie müssen den Zielbereich prüfen ... Dies ist auch nicht sehr optimal und robust. Dies kann O(1),O(log(n)),O(n)
sein, aber normalerweise mit sehr langsamer konstanter Zeit.
emulieren Bit-shif links
Sie können mit Schleife und zusätzlich zu tun:
int x; for (x=1;bit;bit--) x+=x; x--;
Aber in O(n)
läuft. Wie auch immer, das ist immer noch schneller als pow
, es sei denn, Sie haben pow2
implementiert auf HW.
[Anmerkungen]
in der Komplexität Formeln n=bit
und der gesamte Code ist in C++ mit Ausnahme der ersten Formel in der ^
Leistungsmittel.
Bits zählen beginnt von rechts nach links in der Regel –
Wie qualifiziert sich eine Schicht nicht als minimale bitweise Operation? –
@JerryCoffin - es ist auf einigen Systemen als mehrere Operationen (GPUs zum Beispiel) implementiert – user1043761