Schreiben Sie den kürzesten Code, um die Bitreihenfolge einer 32-Bit-Ganzzahl umzukehren.
Regeln:
- Die Eingabe wird als gültige Ganzzahl oder Zeichenfolge angenommen, wenn Ihre Sprache keine numerischen Werte unterstützt (z. B. Windows Batch).
- Die Ausgabe muss eine gültige Ganzzahl oder eine Zeichenfolge sein, wenn Ihre Sprache keine numerischen Werte unterstützt (z. B. Windows Batch).
- Nur Standardbibliothek.
- Dies kann eine Funktion oder ein vollständiges Programm sein.
- Die Eingabe kann entweder von
stdin
oder als Funktionsargument erfolgen. - Die Ausgabe muss entweder
stdout
oder als Rückgabewert erfolgen. - Wenn Ihre Sprache über eine integrierte oder standardmäßige Bibliotheksfunktion verfügt, die dies in einem Schritt erledigt (z. B.
rbit
in der ARM-Assembly), kann diese nicht verwendet werden.
Beispiele:
Schlüssel:
- Dezimal
- binär
- (umkehren)
- umgekehrt binär
- Dezimalausgabe
Beispiele:
-90
(8-Bit-Beispiel zur Demonstration)10100110b
- (umkehren)
01100101b
101
486
00000000000000000000000111100110b
- (umkehren)
01100111100000000000000000000000b
1736441856
-984802906
11000101010011010001100110100110b
- (umkehren)
01100101100110001011001010100011b
1704506019
Hinweis: Auslassungen sind freies Spiel. Wenn ich es nicht gesagt habe und es keine der Standardlücken ist , dann ist es völlig erlaubt.
Antworten:
x86-Assembly, 9 Byte
In Byte-Form:
33 C0 40 D1 E9 13 C0 73 FA
9 Byte.quelle
__fastcall
und hatte das nichtret
.MMIX-Assembly (28 Byte)
64-Bit-Zahlen
Dies setzt sich zusammen zu:
Wie funktioniert es?
Der
MOR
Befehl führt eine Matrixmultiplikation für zwei 64-Bit-Größen durch, die als zwei 8 × 8-Matrizen von Booleschen Werten verwendet werden. Eine boolesche Zahl mit den Ziffern abcdefghklmnopqr 2 wird als Matrix wie folgt verwendet:Der
MOR
Befehl multipliziert die durch ihre Argumente dargestellten Matrizen, wobei Multiplikationand
und Addition vorliegenor
. Es ist:und außerdem:
Dies ist die umgekehrte Reihenfolge der Bits der ursprünglichen Nummer.
32-Bit-Nummern
Wenn Sie nur die Umkehrung einer 32-Bit-Zahl anstelle einer 64-Bit-Zahl wünschen, können Sie diese modifizierte Methode verwenden:
gebaut:
Die erste Matrixmultiplikation funktioniert grundsätzlich so:
Das entsprechende Oktabyte wird
#0000000001020408
in den ersten beiden Anweisungen geladen. Die zweite Multiplikation sieht folgendermaßen aus:Das entsprechende Oktabyte
#0102040810204080
erstellen wir aus der ersten Matrix wie folgt :Die zweite Multiplikation erfolgt wie gewohnt, der resultierende Code hat die gleiche Länge (28 Bytes).
quelle
POLY
Befehl des VAX ist im Grunde genommen ein verschmolzenes Multiplizieren und Addieren mit einer eingebauten Schleife. Ähnliche Dinge gibt es auch in modernen Architekturen (wie x86), aber normalerweise haben sie keine eingebaute Schleife, um ein ganzes Polynom auf einmal auszuwerten.80386-Assembly (
13 bis12 Byte)Als Funktion in der AT & T-Syntax unter Verwendung der Aufrufkonvention cdecl.
Diese Funktion setzt sich aus der folgenden Bytefolge zusammen:
Aufgeschlüsselt in Anweisungen:
Das funktioniert so: In jeder der 32 Iterationen der Schleife wird das Argument, das sich an
4(%esp)
befindet, um eine Position nach rechts verschoben. Das letzte Bit wird implizit in das Übertragsflag verschoben. Deradc
Befehl addiert zwei Werte und addiert den Wert des Übertrag-Flags zum Ergebnis. Wenn Sie einen Wert zu sich selbst hinzufügen, dh%eax
, Sie verschieben ihn effektiv um eine Position nach links. Dies istadc %eax,%eax
eine bequeme Möglichkeit,%eax
um eine Position nach links zu verschieben, während der Inhalt des Übertragsflags in das niederwertige Bit verschoben wird.Ich wiederhole diesen Vorgang 32 Mal, damit der gesamte Inhalt von
4(%esp)
in entleert wird%eax
. Ich initialisiere nie explizit,%eax
da der vorherige Inhalt während der Schleife verschoben wird.quelle
C
635248Originalfassung:
Aktualisierte Version (mit Änderungen, die von Allbeert , es1024 und Dennis vorgeschlagen wurden ):
Hinweis: Da in der zweiten Version die Einstellung weggelassen wird
r=0
, wird im Code vonint
32 Bit ausgegangen . Wenn diese Annahme falsch ist, wird die Funktion höchstwahrscheinlich ein falsches Ergebnis liefern, abhängig vom Anfangszustand desr
Eintritts in die Funktion.Endgültige Fassung (mit weiteren Änderungsvorschlägen von Dennis und Alchymist ):
Hinweis: Dadurch wird die Deklaration der Arbeitsvariablen
r
undi
in die Parameterliste übernommen. Die Parameter lauten wie folgt:n
ist die Zahl, die bitweise umgekehrt werden soll.r
undi
sind Arbeitsvariablen, die als 0 übergeben werden müssen.quelle
int
Funktionstyp entfernen und auchreturn r
zu so etwas wie wechseln ,i=r
da die meisten C-Compiler dazu neigen, das Ergebnis der letzten Operation im Rückgaberegister zu belassen. Es funktionierte auf gcc und cl für mich.r(n){...}
r(int n){...}
int
Inint r=0,i=32;
nicht ablegen, es sei denn, Sie verschieben sie aus dem Funktionskörper.-1 >> 1
ist-1
für AS und2**31 - 1
für LS, während-1 / 2
ist0
.r
undi
als Argumente? Würde drei weitere Bytes sparen ...Julia 0,2, 33 Bytes
Tut, wie es aussieht.
bits
gibt Ihnen die Bit-Darstellung (unter Berücksichtigung des Zweierkomplements).parseint
kümmert sich nicht um das Zweierkomplement, sondern gibt eine 32-Bit-Ganzzahl zurück, sodass das Zweierkomplement einfach durch Überlauf behandelt wird.Gemäß den Änderungsprotokollen wurde
parseint
in Julia 0.3 die Überlauferkennung hinzugefügt , sodass dies möglicherweise nicht mehr funktioniert.quelle
Python 2, 50
Im Großen und Ganzen das Gleiche wie meine Pyth-Lösung. Nehmen Sie den Eingangs-Mod 2 ** 32, konvertieren Sie ihn in eine 32-Bit-Binärdatei, kehren Sie ihn um, konvertieren Sie den Binärstich zurück in eine Dezimalzahl und drucken Sie ihn aus.
quelle
CJam, 15 Bytes
Probieren Sie es online aus.
Verwendeter Joker "Freies Spiel": Die Ausgabe wird immer ein ganze Zahl ohne Vorzeichen.
Testfälle
Wie es funktioniert
quelle
JavaScript (E6) 37
39 40 50Funktion, Zahleneingabe und Rückgabe der umgekehrten Zahl.
Die meisten grundlegenden Algorithmen lassen sich wahrscheinlich mit einem cleveren Trick besser spielen.Rekursion statt Schleife bearbeiten
Bearbeiten Sie 2 nach @bebe Vorschlag
k*2
stattk<<1
Edit 3 Etwas, das ich überhaupt übersehen hatte: Es ist eine vollständige 32-Bit-Schleife, k muss nicht initialisiert werden. Danke @FUZxxl
Es war
Test Testen Sie in der FireFox-Konsole die Verwendung von Zahlen in OP und einigen weiteren zufälligen 16- und 32-Bit-Zahlen
Beispiel für eine Testausgabe
quelle
b=k=0,R=v=>b++<32?R(v>>1,k+=k+(v&1)):k
für den einmaligen Gebrauch undR=(v,b=0,k=0)=>b<32?R(v>>1,b+1,k+k+(v&1)):k
ist wiederverwendbark<<1
wirdk*2
undv>>1
wirdv/2
. es funktionierte für 486. i über andere Testfälle nicht wissenx86-Assemply, 10 Byte
Dies setzt die Eingabe in eax und die Ausgabe in edx voraus. (Außerdem ist am Ausgang eax Null und CF und ZF werden gesetzt, wenn es jemanden interessiert).
Anstelle eines Zählers wird am Anfang eine zusätzliche 1 als Datenendemarker eingefügt
quelle
ret
Anweisung hinzufügen , von der Funktion zurückzukehren und cdecl zu implementieren (dhrcr %eax
zurcr 4(%esp)
undrcl %edx
zu ändernrcl %eax
), erhalten Sie ein zusätzliches Byte für dieret
und zwei weitere Bytes für die Speicherreferenz. Trotzdem eine schöne Lösung.J (
171513 Bytes)Hier ist eine explizite Definition, um zu erklären, was es tut:
#: y
Stellty
als Basis 2 eine Zahl dar, die so viele Stellen wie nötig verwendet.x {. y
Nimmt|x
(Größe vonx
) Elementen vony
vorne, wennx
positiv, von hinten, wennx
negativ. Wenn wir mehr Elemente als vorhanden nehmen, wird das Ergebnis mit Nullen aufgefüllt._32 {. #: y
Füllt effektiv#: y
auf 32 Bit auf.|. y
flippty
, ich. kehrt die Reihenfolge der Elemente in umy
.#. y
interpretierty
als Basis-2-Zahl.quelle
Dyalog APL , 10 Bytes
2⊥
from-base-2 von⌽
das Gegenteil⎕
numerische Eingabe⊤⍨
im Zahlensystem bestehend aus32/2
32 BitsTryAPL online!
quelle
Python - 89
Python repräsentiert negative Binärzahlen so einfach
-0b{positive_number}
. Ergänzen Sie negative Zahlen und dann XOR mit allen Einsen, um damit umzugehen.Erstellen Sie anschließend die Zeichenfolgendarstellung der Ganzzahl basierend auf dem Format
{:032b}
, das die 32-Bit-Darstellung der Zahl bereitstellt. Kehren Sie schließlich die Zeichenfolge um und wandeln Sie sie wieder in eine Ganzzahl um.BEARBEITEN
Vielen Dank an @Martin Büttner für den Hinweis auf ein Zweierkomplement. Wenn
n
mit einer 1 endet, dann wäre die umgekehrte Version mit dem Zweierkomplement negativ.Glücklicherweise mag Python, wie oben erklärt, negative Binärzahlen auf ziemlich einfache Weise. Zum Glück erlaubt Pythons
int
Funktion im ersten Argument optionale Zeichen .Fügen Sie nun ein Minuszeichen hinzu, wenn
n
ungerade ist, um das Zweierkomplement zu erfüllen.quelle
['','-'][n%2]
ist'-'*(n%2)
.Pyth ,
333222Erläuterung:
Golfplätze:
33 -> 32: Add to vor dem Umkehren verschoben, um ein Endzitat zu speichern.
32 -> 22: Q mod 2 ^ 32 anstelle von komplizierten Maschinen verwendet. Kombiniert beide Saiten zu einer.
Testfälle:
quelle
GNU DC, 27 Bytes
Ausgabe:
Bash + Coreutils, 45 Bytes
Ausgabe:
C-Funktion, 89 Bytes
Dieselbe Idee wie /codegolf//a/36289/11259 - unter Verwendung der Stanford-Bit-Twiddling-Hacks . Das Golfen nicht gewinnen, aber trotzdem interessant:
Ausgabe:
quelle
Java-Funktion, 64 Zeichen.
Sollte auch in C funktionieren.
quelle
PHP, 46 Bytes
Online-Versionen
oder
quelle
substr
ist unnötig (-12 Bytes). Sie sollten erwähnen, wie man sie laufen lässt.-984802906
?<?=bindec(strrev(sprintf("%064b",$argn<<32)));
JS 115
Nun, das sieht überhaupt nicht gut aus: D
Die Methode von @Florian F in JS ist 53 Byte lang:
quelle
it may be a function
Regel besagt, dass Sie keine Warnung oder Aufforderung benötigenC #
8174Bitoperationen, die wahrscheinlich in allen Programmiersprachen kürzer ausgeführt werden können.
Grundsätzlich durchlaufen Sie alle Potenzen von 2 bis zu einer Ganzzahl von maximal + 1 (was zu einer Zweierpotenz wird) und da (2.147.483.647 + 1) = 0, kann ich eine Schleife auf 0 durchführen. Bitverschiebung von links nach rechts, um das Bit in die erste zu verschieben Position. Das letzte Bit an Platz 32 geht 31 Schritte nach rechts, das vorletzte geht 30 usw. Wenn Sie also den AND-Operator mit 1 verwenden, weiß ich, ob es 1 oder 0 ist. Wenn es 1 ist, addiere ich den aktuellen i-Wert zum Ergebnis und Gib es zurück.
quelle
i
wenn Sie es deklarieren, und ein Byte speichern, indem Sie esi++
aus der for-Schleife entfernen. Anstatt das Ergebnis von1&...
mit 0 zu vergleichen, können Sie die if-Anweisung ganz entfernen undi
mit dem Ergebnis multiplizieren, dasr|=i*(1&(V>>(31-l++)));
in der SchleifeC # 142
Erweitert
quelle
Python - 37
Ähnlich wie bei @ isaacg's Lösung.
quelle
C ++, 160
Dies ist nicht die kürzeste, verwendet jedoch nur 24 Operationen.
Entnommen aus Hackers Delight-Buch.
Golf gespielt:
Ungolfed:
quelle
Haskell, 145 - keine bitweisen Operationen
Bit-Twiddling scheint mir das Gegenteil von Haskell zu sein, daher habe ich die Verwendung bitweiser Operatoren vermieden. Das resultierende Programm ist sicherlich nicht der kürzeste Teilnehmer, aber ich fand die Verwendung von Mathematik anstelle von Bit-Twiddling zumindest interessant.
Erläuterung
0
s und1
s, dem niedrigstwertigen Bit, indem es wiederholt durch 2 dividiert und den Rest aufnimmt0
s an das Ende dieser Liste0
und1
in eine ganze Zahl , die unter der Annahme , am meisten signifikante Bit zuerst (wiederholte Doppel und ADD).Ich bin nicht ganz sicher, was "die Standardbibliothek" in Haskell ausmacht, also nahm ich an, dass Data.Tuple und Data.List in Ordnung waren (sie sind ziemlich Standard).
Die Ausgabe ist auch eine vorzeichenlose 32-Bit-Ganzzahl, da Änderungen, die mich Byte kosten würden: Ich argumentiere dies unter "Auslassungen sind freies Spiel".
quelle
PHP,
4641 BytesProbiere sie online aus
bitweise ... mehr oder weniger. Als Rohr mit laufen lassen
php -nR '<code>'
.PHP, 46 Bytes
eine reine bitweise Lösung; als Pfeife mit laufen
-nR
.PHP,
4759 Bytesein weiterer integrierter Ansatz; In Datei speichern und als Pipe mit ausführen
-F
.quelle
Perl - 60
+1 für das p-Flag (lass es mich wissen, wenn ich das falsch zähle).
Laufen mit:
quelle
C ++ 69
quelle
e;i;
? Deklarationen ohne Typ sind kein gültiges C ++. Für Variablen ist es nicht einmal gültig C.int r(int n){int e=0,i=0;for(;i<32;)e=e*2|1&n>>i++;return e;}
61 Bytes :)R 45
Beispiele:
Immer nur schüchtern von den Python-Antworten. Das verdammte Funktionsschlüsselwort.
quelle
Rubin,
4341 Bytesdef r(n)(0..31).inject(0){|a,b|a*2+n[b]}end
In Ruby gibt die Verwendung der Indexnotation in Klammern (foo [i]) das Bit an der n-ten Stelle zurück.
--Bearbeiten--
Durch das Refactoring der
inject
Funktionalität werden einige Bytes gespartdef r(n)z=0;32.times{|i|z=z*2+n[i]};z;end
quelle
Perl5: 46
Nichts Außergewöhnliches. Die Ausgabe wird nach links verschoben. Kopieren Sie lsb, bevor Sie die Quelle nach rechts verschieben.
quelle
Clojure,
202156142quelle
Perl (37 + 1)
Im Grunde genommen ein Port der C-Lösung von Todd Lehman
perl -E '$t=<>;map$r=2*$r|1&$t>>$_,0..31;say$r'
quelle