Geben Sie für jede positive 32-Bit-Ganzzahl ( 1 ≤ n ≤ 0xFFFFFFFF
) die Anzahl der zur Darstellung dieser Ganzzahl erforderlichen Bits aus.
Testfälle
| n | n in binary | bits needed |
|----------------------------------|
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 3 | 11 | 2 |
| 4 | 100 | 3 |
| 7 | 111 | 3 |
| 8 | 1000 | 4 |
| 15 | 1111 | 4 |
| 16 | 10000 | 5 |
| 128 | 10000000 | 8 |
| 341 | 101010101 | 9 |
4294967295 => 11111111111111111111111111111111 => 32
So f(16)
würde drucken oder Rückkehr5
Das ist Code-Golf . Kürzester Code in Bytes gewinnt
floor(log2(num))+1
num
eine Zweierpotenz vorliegt.Antworten:
05AB1E , 2 Bytes
Probieren Sie es online!
quelle
bg
bg
.bg
in Gaming bedeutetbad game
:)JavaScript (ES6), 18 Byte
quelle
n>>>1
unterstützen seinn > 0x7FFFFFFF
?>>
ausgefallen istn
. Vielen Dank.f=(a,b=1)=>a>1?f(a>>1,++b):b
x86-Assembly, 4 Byte
Unter der Annahme konstant in
EBX
:EAX enthält die Anzahl der für Constant erforderlichen Bits.
Bytes:
☼¢├@
Hexadezimal:
['0xf', '0xbd', '0xc3', '0x40']
quelle
Python , 14 Bytes
Probieren Sie es online!
quelle
bit_length
istbit_length()
.int.bit_length(n)
undn.bit_length()
genau das gleiche tun.int.bit_length(n)
ist ein Funktionsaufruf , und damit ein Ausschnitt, der die Eingabe annimmt wird in einer Variablen gespeichert. Dies ist nach unseren Regeln nicht zulässig, daher macht das Anhängen(n)
diese Antwort ungültig. Allerdingsint.bit_length
wertet auf eine Funktion und kann in einer Variablen für die spätere Verwendung gespeichert werden. Dies ist standardmäßig erlaubt.Labyrinth ,
1312 BytesProbieren Sie es online!
Erläuterung
Das Programm teilt die Eingabe einfach wiederholt durch 2, bis sie Null ist. Die Anzahl der Schritte wird nachverfolgt, indem der Wert bei jedem Schritt dupliziert wird. Sobald es auf Null reduziert ist, drucken wir die Stapeltiefe (minus 1).
Das Programm startet bei dem,
?
der die Eingabe liest. Die Hauptschleife ist dann der darunter liegende 2x2-Block gegen den Uhrzeigersinn:Sobald der Wert nach einer vollständigen Iteration Null ist, wird das lineare Bit am Ende ausgeführt:
quelle
C 31 Bytes
... Dann habe ich über Rekursion nachgedacht. Von dunkel zu offensichtlich und mit einem Viertel der Länge abgefallen.
Sehen Sie es live auf Coliru
C 43 BytesDas Aufrufen
f
mit einem vorzeichenlosen Wert (zBf(42u)
) "gibt" seine Bitlänge zurück. Funktioniert sogar für0u
!Ungolfed und erklärt: (Backslashes weggelassen)
Sehen Sie es live auf Coliru
quelle
n?...:0
ist also nicht notwendig.#define f(n) ({64-__builtin_clzl(n);})
Ansatz zu verwenden .Mathematica, 9 Bytes
Alternative:
quelle
Perl 6 , 7 Bytes
Versuch es
Erläuterung:
*
macht es zu einem WhateverCode-Lambda und gibt an, wo die Eingabe erfolgen soll.msb
on an Int liefert den Index des höchstwertigen Bits (0-basiert)+1
wird mit dem Lambda kombiniert und addiert eins zum späteren Ergebnis des Aufrufs.msb
.quelle
C Präprozessor-Makro (mit gcc-Erweiterungen), 26
Verwendet die eingebauten führenden Nullen von GCC .
Rufen Sie dies als eine Funktion auf, z
f(100)
.Probieren Sie es online aus .
quelle
Retina ,
5637 BytesDiese Lösung funktioniert mit allen erforderlichen Eingabewerten.
Das größte Problem, mit dem Retina bei dieser Herausforderung konfrontiert ist, ist die Tatsache, dass die Zeichenfolgen eine maximale Länge von 2 ^ 30 Zeichen haben. Daher funktioniert die übliche Art des Umgangs mit Zahlen (unäre Darstellung) nicht mit Werten über 2 ^ 30.
Um dieses Problem zu lösen, habe ich einen anderen Ansatz gewählt, bei dem eine Art Dezimaldarstellung von Zahlen beibehalten wurde , bei der jedoch jede Ziffer unär geschrieben ist (ich bezeichne diese Darstellung als Digitunary ). Zum Beispiel würde die Nummer
341
wie111#1111#1#
im Digitunary geschrieben werden. Mit dieser Darstellung können wir jetzt mit Zahlen bis zu2^30/10
Ziffern (~ 100 Millionen Ziffern) arbeiten. Es ist weniger praktisch als Standard für beliebige Arithmetik, aber mit ein wenig Aufwand können wir jede Art von Operation ausführen.Der Algorithmus, den ich verwendet habe, macht aufeinanderfolgende ganzzahlige Divisionen durch zwei, bis wir Null erreichen. Die Anzahl der Divisionen, die wir gemacht haben, ist die Anzahl der Bits, die zur Darstellung dieser Anzahl benötigt werden.
Also, wie teilen wir digital durch zwei? Hier ist das Retina-Snippet, das das macht:
Dieser Ersatz reicht aus, um eine digitale Zahl durch 2 zu teilen. Wenn die ursprüngliche Zahl ungerade war, müssen wir nur mögliche .5s vom Ende entfernen.
Also, hier ist der vollständige Code, wir teilen ihn durch zwei, bis die Zahl noch Ziffern enthält, und setzen
n
bei jeder Iteration ein Literal vor die Zeichenfolge: Die Zahln
am Ende ist das Ergebnis.Probieren Sie es online!
Aktualisierte Lösung, 37 Bytes
Großes Refactoring mit vielen guten Ideen, die rund ein Drittel der Länge ausmachten, alles dank Martin Ender!
Die Hauptidee ist,
_
als unäres Symbol zu verwenden: Auf diese Weise können wir reguläre Ziffern in unserer Zeichenfolge verwenden, solange wir sie_
bei Bedarf wieder in s konvertieren. Auf diese Weise können wir beim Teilen und beim Einfügen mehrerer Bytes viele Bytes einsparen Ziffern.Hier ist der Code:
Probieren Sie es online!
quelle
Ruby,
1916 BytesVielen Dank an Jordan, dass er 3 Bytes abgespielt hat
quelle
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 Bytes
Einfach in Binär umwandeln und dann die Länge ermitteln.
quelle
Julia 0,4 , 14 Bytes
Probieren Sie es online!
quelle
JavaScript ES6, 19 Byte
Math.clz32
Gibt die Anzahl der führenden Null-Bits in der 32-Bit-Binärdarstellung einer Zahl zurück. Um die Anzahl der benötigten Bits zu erhalten, müssen wir diese Zahl von 32 abziehenquelle
a=>1+Math.log2(a)|0
ist auch 19 Bytes.1+...|0
schreit minus Tilde !a=>-~Math.log2(a)
is 18Bash / Unix-Tools, 16 Byte
Speichern Sie dies in einem Skript und übergeben Sie die Eingabe als Argument. Die Anzahl der Bits, die für die Darstellung dieser Zahl in Binärform erforderlich sind, wird gedruckt.
Hier ist eine Erklärung:
dc ist ein stapelbasierter Rechner. Seine Eingabe, die in Token zerlegt wird, lautet:
2 - Schieben Sie 2 auf den Stapel.
o - Entferne einen Wert vom Stack (das ist 2) und mache ihn zur Ausgabebasis (die Ausgabe ist jetzt binär).
Der Wert des Arguments an das Bash-Programm ($ 1) - Verschieben Sie dieses Argument auf den Stapel.
n - Entferne einen Wert vom Stack (das ist die Eingabe-Nummer) und drucke ihn (binär, weil das die Ausgabe-Basis ist) ohne nachfolgende Newline.
Der Befehl dc gibt die Zahl also binär aus.
Die Ausgabe von dc wird mit der Option -c an den Befehl wc weitergeleitet, der die Anzahl der Zeichen in seiner Eingabe ausgibt.
Das Endergebnis besteht darin, die Anzahl der Stellen in der Binärdarstellung des Arguments auszudrucken.
quelle
Google Sheets, 15 Bytes
Übernimmt die Eingabe von der Zelle
A1
und gibt sie an die Zelle aus, die die Formel enthältoder
oder
Excel, 17 Bytes
Wie oben, jedoch für MS Excel formatiert
oder
oder
quelle
Pyth, 3 Bytes
Test-Suite hier verfügbar.
Erläuterung
quelle
hsl
oder.El
, in deml
die Stammbasis 2 berechnet und /hs
oder die.E
Decke berechnet wird.Gelee, 2 Bytes
Wandelt in Binär um, findet Länge.
quelle
C #,
634531 BytesDank Loovjo und TuukkaX wurden 18 Byte gespeichert
14 Bytes gespart, dank Grax
Es wird verwendet, dass eine Dezimalzahl n ⌊log2 (n) ⌋ + 1 Bits hat, was auf dieser Seite beschrieben wird:
quelle
...)+ 1)...
->...)+1...
. Ich denke auch, dass Sie den Wert direkt zurückgeben können, anstatt ihn zu drucken.b=>1+(int)System.Math.Log(b,2);
Sie Folgendes ausführen: Die int-Konvertierung liefert die gleiche Ausgabe wie Math.Floor, und Sie benötigen die using-Anweisung nicht, wenn Sie nur einmal auf System verweisen.C #, 32 Bytes
Konvertiert den Parameter in eine Binärzeichenfolge und gibt die Länge der Zeichenfolge zurück.
quelle
Haskell, 20 Bytes
Verfasst eine Funktion, die die Logarithmusbasis 2, Fußböden und Addition 1 annimmt.
quelle
Befunge-93 ,
2321 BytesBefunge ist eine auf 2D-Rastern basierende Sprache (obwohl ich nur eine Zeile verwende).
Probieren Sie es online!
quelle
Qualle , 4 Bytes
Probieren Sie es online!
Print (
p
), die Länge (#
) der Binärdarstellung (b
) der Eingabe (i
).quelle
CJam , 5 Bytes
Probieren Sie es online!
Eingabe lesen (
r
), in Ganzzahl konvertieren (i
), Binärdarstellung abrufen (2b
), Länge abrufen (,
).quelle
Oktave , 19 Bytes
Anonyme Funktion, die 1 addiert, den binären Logarithmus berechnet und aufrundet.
Probieren Sie es online!
quelle
QBIC , 18 Bytes
Das ist unglaublich, Mike! Aber wie geht das?
quelle
Java 8,
3427 BytesFür einmal hat Java einige nützliche eingebaute Funktionen! Jetzt brauchen wir nur noch ein paar kürzere Namen ...
Probieren Sie es online!
Natürlich können Sie dies auch ohne integrierte Funktionen tun ( siehe Schneemanns Antwort ), jedoch für eine höhere Byteanzahl .
quelle
Oktave, 19 Bytes
Octave hat zwei Funktionen zum Konvertieren von Dezimalzahlen in Binärzahlen.
dec2bin
konvertiert eine Zahl in eine Zeichenkette1
und0
(ASCII-Werte48
und49
). Die Länge der Zeichenfolge entspricht der erforderlichen Anzahl von Bits, sofern nicht anders angegeben. Da die Zeichen1
und0
Nicht-Null sind, können wir verwenden , umnnz
die Anzahl der Elemente wie folgt zu finden:@(x)nnz(dec2bin(x))
. Das sind 19 Bytes, also ist es mit Luis Mendos anderer Octave-Antwort verknüpft .Können wir es besser machen
de2bi
?de2bi
ist eine Funktion, die die Binärzahlen als Vektor mit den Zahlen1
und0
als Ganzzahlen und nicht als Zeichen zurückgibt .de2bi
ist offensichtlich zwei Bytes kürzer alsdec2bin
, aber wir können nicht mehr verwendennnz
. Wir können es verwenden,nnz
wenn wir entweder1
zu allen Elementen hinzufügen oder es zu einem logischen Vektor mit nurtrue
Werten machen.@(x)nnz(de2bi(x)+1)
und@(x)nnz(de2bi(x)<2)
sind beide 19 Bytes. Wenn Sie verwendennumel
, erhalten Sie auch 19 Byte@(x)numel(de2bi(x))
.rows
ist ein Byte kürzer alsnumel
, gibt aberde2bi
einen horizontalen Vektor zurück, muss also transponiert werden.@(x)rows(de2bi(x)')
Zufällig sind es auch 19 Bytes.quelle
Pyke, 3 Bytes
Probieren Sie es hier aus!
quelle
Retina ,
4423 BytesBenötigt zu viel Speicher für große Eingabewerte. Wandelt in Unary um und dividiert dann wiederholt durch 2, wobei gezählt wird, wie oft, bis Null erreicht wird. Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online aus
quelle