anzahl benötigter bits
-
So etwas kann man auch wunderbar tabellieren, dann spart man sich den teuren Logarithmus für solch eine triviale Berechnung. Da man weiterhin wohl nur an der Anzahl nötiger chars interessiert ist, wird die Tabelle sogar um einen Faktor 8 kleiner, als man naiv annehmen würde:
unsigned get_number_of_chars(size_t cardinality) { for (unsigned i = 0; i < sizeof(cardinality); ++i) if (cardinality < 1 << i * CHAR_BIT) return i; return sizeof(cardinality); }
-
doktor banane schrieb:
ich war grad bissl verwirrt weil es ja keinen log mit basis 2 von c++ aus direkt gibt.
Ja, das versteh ich auch nicht ganz.
Man kann sich aber mit
sizeof(unsigned) - __builtin_clz(i)behelfen.
-
Zusatzfrage: Ist eine einfache, platformunabhängige Implementierung möglich, die die benötigte Bytezahl einer Compilezeitkonstanten zur Compilezeite berechnet? Ich denke das wäre für einige statische Überprüfungen durchaus hilfreich.
-
Da könnte man doch sicher was mit TMP machen, oder?
-
Man kann das sicherlich, ich aber leider nicht.

-
Damit ergeben sich doch sicherlich sehr viele tolle Möglichkeite für Templates wie: "Wähle als Typ für die Variable den kleinsten unsigned Integertyp, in den die Zahl noch gerade rein passt". Mir fällt aber gerade auf, dass man das viel leichter mit numeric_limits lösen kann, falls ich mich nicht irre.
-
TNA schrieb:
Ich denke das wäre für einige statische Überprüfungen durchaus hilfreich.
Braucht kein Mensch.
Wähle als Typ für die Variable den kleinsten unsigned Integertyp, in den die Zahl noch gerade rein passt
auto i = 999999999999;Mir fällt aber gerade auf, dass man das viel leichter mit numeric_limits lösen kann, falls ich mich nicht irre.
Hmm... Du bist ein ganz Schlauer!
-
g3il3rCXXfr33k schrieb:
Wähle als Typ für die Variable den kleinsten unsigned Integertyp, in den die Zahl noch gerade rein passt
auto i = 999999999999;Das erzeugt aber eine Initialisierung zur Laufzeit die man eventuell nicht haben möchte oder?
-
doktor banane schrieb:
achja log n / log 2. ich war grad bissl verwirrt weil es ja keinen log mit basis 2 von c++ aus direkt gibt. danke viel mals an alle
siehe auch http://en.cppreference.com/w/cpp/numeric/math/log2
-
TNA schrieb:
g3il3rCXXfr33k schrieb:
Wähle als Typ für die Variable den kleinsten unsigned Integertyp, in den die Zahl noch gerade rein passt
auto i = 999999999999;Das erzeugt aber eine Initialisierung zur Laufzeit die man eventuell nicht haben möchte oder?
Dann eben:
decltype(999999999999) i;