2015-08-26 13 views
9

Gegeben eine Integer, 98749287 sagen, gibt es einige eingebaute/libray Funktion, entweder Erlang oder Elixir, um die Größe in Bytes zu erhalten?Die Größe in Bytes einer beliebigen ganzen Zahl

Um zu verdeutlichen, die minimale Anzahl von Bytes verwendet, um die Zahl in binär darzustellen.

Scheint einfach, und habe eine Funktion geschrieben mit der "Division by base" -Methode und dann Bits zählen, aber nach einigen Stunden der Suche haben Dokumente nichts gefunden für was sinnvoll scheinen würde.

+1

OOC , Was versuchst du zu machen? – zxq9

+1

Ich muss einige Integer codieren mit Basic Encoding Rules (Packen beliebiger Integer-Teile in Reihen von 7 Bits). – Englishbob

+3

Es gibt ein ASN.1-Modul für Erlang, das ziemlich gut funktioniert. Abhängig von Ihren allgemeinen Bedürfnissen könnte dies eine bessere Option sein (ich benutze es regelmäßig!). – zxq9

Antwort

11

Wenn Sie eine ganze Zahl ohne Vorzeichen haben, können Sie das folgende Snippet verwenden:

byte_size(binary:encode_unsigned(Integer)) 

Beispiel:

1> byte_size(binary:encode_unsigned(3)). 
1 
2> byte_size(binary:encode_unsigned(256)). 
2 
3> byte_size(binary:encode_unsigned(98749287)). 
4 
+0

Genau das, was ich gesucht habe. Problem mit dem Lernen Elixir ist, dass es leicht ist, die Erlang-Dokumentation zu vergessen (oder eher "vermeiden"). Kann jetzt ein paar Funktionen wegwerfen. – Englishbob

+1

Ja, kann schwierig sein. Dies hilft nur, wenn Sie auf OS X sind, aber ich verwende normalerweise Dash und suche die Erlang- und Elixir-Dokumentation gleichzeitig nach Dingen wie "Ganzzahl", "Binär" und "Größe" und so weiter. Das ist eine großartige Möglichkeit, um möglicherweise relevante Funktionen zu finden. –

1

Versuchen Sie diesen Ausdruck:

Value = (... your input ...), 
NumBytes = size(integer_to_binary(Value, 2) + 7) div 8. 

Referenz: http://www.erlang.org/doc/man/erlang.html#integer_to_binary-2

+0

Das scheint zu funktionieren. obwohl eine unordentliche Dezimalzahl übrig bleibt, die gerundet werden muss. Was war das Denken über die +7? – Englishbob

+0

Die +7 soll versuchen aufzurunden. Bitte ändern Sie die Aufteilung in einen Bodenbelag oder Integer-Division, wie der C-Operator '/'. – Nayuki

+1

Mache das 'div 8' anstelle von'/8' für die Ganzzahldivision. – legoscia

Verwandte Themen