Wie die meisten von Ihnen wahrscheinlich wissen, können (byteadressierbare) Hardwarespeicher in zwei Kategorien unterteilt werden - Little Endian und Big Endian . In Little-Endian-Speichern werden die Bytes beginnend mit 0 am kleinen (niedrigstwertigen) Ende und in Big-Endian-Speichern umgekehrt nummeriert.
Wissenswertes : Diese Begriffe basieren auf Jonathan Swifts Buch Gullivers Reisen, in dem der lilliputanische König seinen Bürgern befahl, ihre Eier am kleinen Ende zu zerbrechen (also die Little Endians) und die Rebellen am großen Ende.
So funktioniert Tauschen
Angenommen, wir haben eine vorzeichenlose Ganzzahl (32 Bit) 12648430
im Speicher in einer Big-Endian-Maschine, die wie folgt aussehen könnte:
addr: 0 1 2 3
memory: 00 C0 FF EE
Durch Invertieren der Bytereihenfolge erhalten wir die hexadezimale Ganzzahl, 0xEEFFC000
die 4009738240
dezimal ist.
Deine Aufgabe
Schreiben Sie ein Programm / eine Funktion, die eine 32-Bit-Ganzzahl ohne Vorzeichen als Dezimalzahl empfängt und die sich ergebende Ganzzahl beim Tauschen der Endianze wie oben beschrieben ausgibt.
Regeln
- Die Eingabe wird immer im Bereich von
0
bis liegen4294967295
- Die Ausgabe kann auf STDOUT gedruckt (nachgestellte Zeilenumbrüche / Leerzeichen sind in Ordnung) oder zurückgegeben werden
- Eingabe und Ausgabe erfolgen dezimal
- Verhalten bei ungültiger Eingabe bleibt undefiniert
Testfälle
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
wird dezimal angegeben, ist aber technisch gesehen beispielsweise in C binär. Sie können natürlich eingeben0x2a
, was ich verhindern wollte, ist die Eingabe als Zeichenfolge"2a"
oder dergleichen.Antworten:
x86_32-Maschinensprache, 3 Byte
Das ist ein kleiner Betrug. Die Aufrufkonvention für Pascal-Register (siehe Wikipedia ) ist ein bisschen wie __fastcall, außer dass sie den ersten Parameter in eax übergibt und eax auch den Rückgabewert enthält. Es ist auch eine Aufräumaktion, aber da wir den Stack nur für den Rückgabezeiger verwenden, müssen wir nichts tun. Dies ermöglicht es uns, ein mov oder xchg zu vermeiden und einfach bswap direkt zu verwenden.
quelle
bswap
x86_64 Maschinensprache Linux,
54 BytesDanke an @peter ferrie für -1.
Probieren Sie es online!
quelle
C (gcc),
20,2917 Bytes@Hvd's Vorschlag.
Probieren Sie es online!
Alte Antwort;
include sollte import sein.
quelle
Japt ,
1014 BytesVersuch es
Erläuterung
Wandle eine ganze Zahl in eine Zeichenfolge zur Basis 16 (
sG
) um0
, fülle den Anfang mit einer Länge von 8 (ùT8
) auf, teile ihn in ein Array mit 2 Zeichenfolgen (ò
) auf, kehre (w
) um, verbinde ihn wieder mit einer Zeichenfolge (¬
) und wandle ihn zurück in eine Zeichenfolge zur Basis 16 ( ). 10 (nG
).quelle
y
diese haben, wenn Sie einer Funktion eine Funktion zuweisen, ihre normale Transformation anwenden, die Funktion ausführen und dann die Transformation invertieren. In diesem Fall würde es meiner Meinung nachsG_ò w ¬
für 8 Bytes gekürzt werden können . Oder wennò
es auch so wäre, könnte es sogarsG_ò2_w
für 7 sein ...&.
Adverb in J macht das und es ist manchmal sehr hilfreich beim Golfen. Das Codieren in allen Inversionen kann jedoch mühsam sein.sG_òw...
, konnte für das Leben von mir nicht herausfinden, warum es nicht funktionieren würde! Ich habe meine Fehler irgendwann gemerkt!Gelee , 10 Bytes
Probieren Sie es online!
quelle
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 Bytes
Probieren Sie es online!
quelle
i*8
und nichti
abi=24
.x%256
sind nicht notwendig.APL + WIN 14 Bytes
Erläuterung
quelle
256⊥⌽⎕⊤⍨4⍴256
für -1 Byte arbeiten?C # ,
7068 BytesDies ist wahrscheinlich nicht optimal.
68
70
Probieren Sie es online!
quelle
return
Ausdruck verschieben und dann die Member-Syntax mit Ausdruck verwenden:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
für 64 Bytes.0xFF00FF
zweimal verwenden, indem>>
Sie sie vorher&
eingeben, und Sie können sie dann0xFF00FF
auf~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
für 60 verkürzen . TIO linkWolfram Language (Mathematica) , 24 Byte
Probieren Sie es online!
Kehrt die Eingabe um, die als Ganzzahl in der Basis 256 mit 4 Stellen interpretiert wird.
quelle
05AB1E ,
1210 BytesProbieren Sie es online! Erläuterung:
quelle
JavaScript (ES6),
4543 Bytequelle
t=0
speichert 2 Bytes:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 Bytes
Probieren Sie es online!
-1 danke an Neil .
Port meiner Gelee Antwort.
quelle
MATL ,
1210 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
JavaScript (ES6),
51 bis45 Byte6 Bytes mit Hilfe von @ Neil gespeichert
Testfälle
Code-Snippet anzeigen
quelle
f=(n,p=0,t=4)=>t?f(n/256|0,p*256+n%256,t-1):p
.n=>(n>>>24|n>>8&65280|n<<8&16711680|n<<24)>>>0
J, 16 Bytes
Probieren Sie es online!
Arbeit an der Verkürzung des rechten Ausdrucks. Ich glaube, ich kann ein paar Bytes sparen, wenn ich das mit einer Beta-J-Version mache. Ich schwöre, ich habe hier gesehen, dass Sie einen Zug mit einem Substantiv in einer neuen Beta-Version beenden können ...
Erläuterung
In 4-stellige Basis 256 konvertieren, die Ziffern umkehren und dann zurück in Dezimalzahlen konvertieren. Führen Sie grundsätzlich den im OP bereitgestellten Algorithmus aus. Dies ist möglicherweise das einzige Mal, bei dem es hilfreich ist, dass bei der gemischten Basiskonvertierung von J die Anzahl der Stellen angegeben werden muss, obwohl dies 2 Byte weniger wäre, wenn ich den Zug mit einem Substantiv beenden könnte (
(#:~4#256)
stattdessen).quelle
Excel VBA,
10392 BytesAnonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich
[A1]
in hexadezimal umwandelt, Bytes umkehrt und an das VBE-Direktfenster ausgibtquelle
PPC-Assembly (32-Bit), 8 Byte
Wie das funktioniert:
Leider gibt es keine Online-Emulatoren für PPC-Assemblys, die ich demonstrieren könnte. Es tut uns leid!
quelle
Befunge,
6261 oder 49 BytesProbieren Sie es online!
Hierbei wird der Standard Befunge für den Referenzinterpreter verwendet. Daher müssen wir die Tatsache berücksichtigen, dass die Speicherzellen mit 8-Bit-Vorzeichen versehen sind und einen möglichen vorzeichenbehafteten Überlauf korrigieren.
Bei Implementierungen mit vorzeichenlosen Speicherzellen (z. B. PyFunge) oder wenn der Bereich größer als 8 Bit ist (z. B. FBBI), können wir ohne diese Überprüfungen davonkommen und 12 Byte einsparen.
Versuchen Sie FBBI online!
Versuchen Sie PyFunge online!
Beachten Sie, dass PyFunge eine Ganzzahleingabe für die Fehlerverarbeitung hat. Wenn Sie also mit TIO testen, müssen Sie der Zahl im Eingabefeld ein Leerzeichen oder einen Zeilenumbruch folgen.
quelle
Oktave , 10 Bytes
Probieren Sie es online!
Dies könnte das erste Mal sein, dass Octave genau die gleiche Punktzahl wie sein Golf-Derivat MATL hat. Natürlich ist in diesem Fall Octave anstelle von MATL eingebaut, was es viel einfacher macht.
Definiert ein Handle für das integrierte Element
swapbytes
, das einen beliebigen Datentyp annimmt, die Endianness austauscht und das Ergebnis ausgibt. In diesem Fall ist die Eingabe eine 32-Bit-Ganzzahl ohne Vorzeichen.quelle
C #,
4436 BytesProbieren Sie es online!
Dies basierte ursprünglich auf der C # -Antwort von Polynomial , die vorschlug, eine neue Antwort mit meinen Verbesserungen zu veröffentlichen, aber der Ansatz in Arnauld's JavaScript-Antwort erwies sich in C # als noch kürzer.
quelle
R , 86 Bytes
Ich dachte, es gibt bereits eine (oder zwei) Antworten auf diese Frage in R, aber ich muss mich geirrt haben, oder sie hatten dieselben Probleme, die ich hatte, wenn R keine signierten Eingaben machte. Dieses Problem hat alle Buildins beseitigt, die hätten helfen können. Ich habe die 256-Basis-Konvertierung ausprobiert, aber sie hat sich als zu lang erwiesen, aber ich denke, es gibt immer noch Raum für jemanden, der klüger ist als ich. Dann kam ich zu dem Ergebnis, dass es sich um eine Basis 2-Konvertierung handelte, die die Reihenfolge in eine rekursive Funktion umtauschte.
Probieren Sie es online!
quelle
R , 41 Bytes
Probieren Sie es online!
Überprüfen Sie alle Testfälle!
Verwendet eine Basis-256 Konvertierung als MickyT vorgeschlagen hier . R hat weder vorzeichenlose 32-Bit-Ganzzahlen noch 64-Bit-Ganzzahlen. Dies hindert uns daran, bitweise Operationen zu verwenden, aber dieser Ansatz (und wahrscheinlich MickyTs) ist wahrscheinlich immer noch kürzer, da die bitweisen Operatoren von R ziemlich ausführlich sind.
Verwendet Nummer 4 dieses Tipps , wobei zu berücksichtigen ist, dass wir niemals eine Nummer erhalten, die so groß ist wie
256^4
.n%/%256^(0:3)%%256
extrahiert die Bytes, und%*%
das Matrixprodukt ist in dieser Situation das Skalarprodukt, wobei256^(3:0)
die umgekehrte Reihenfolge der Bytes bewirkt wird.%*%
Gibt ein 1x1 zurück,matrix
das den Endian-umgekehrten Wert enthält.quelle
CP-1610- Baugruppe, 6 DECLEs = 8 Byte
Dieser Code soll auf einer Intellivision ausgeführt werden .
Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Diese Funktion ist 6 DECLE lang und beginnt bei $ 480C und endet bei $ 4811.
Der CP-1610 verfügt über 16-Bit-Register, daher verwenden wir zwei davon (R0 und R1), um einen 32-Bit-Wert zu speichern.
Execution Dump
quelle
C # (.NET Core) , 72 + 31 = 103 Byte
Probieren Sie es online!
+31 für
using System;using System.Linq;
Ich hatte gehofft,
Array.Reverse
Inline zu verwenden , aber es sollte nicht sein (siehe Alternative unten).C # (.NET Core) , 87 + 13 = 100 Byte
Probieren Sie es online!
+13 für
using System;
Diese Lösung pflegen von @JeppeStigNielsen; Aufhebung der Einschränkung, dass alles inline gespeichert werden soll (3 Byte).
quelle
using System.Linq;
, ist die Verwendung immer noch billigerx=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 Bytes
Probieren Sie es online!
Ungolfed:
quelle
Schnell, 28 Bytes
quelle
ARM Maschinensprache Linux, 8 Bytes
Um dies selbst zu versuchen, kompilieren Sie Folgendes und führen Sie es auf einem Raspberry Pi oder Android-Gerät aus, auf dem GNUroot ausgeführt wird
quelle
Perl 5 , 27 Bytes
Probieren Sie es online!
quelle
Perl 5
-p
, 21 BytesProbieren Sie es online!
quelle
K4 , 18 Bytes
Lösung:
Beispiele:
Erläuterung:
Es gibt keine vorzeichenlosen Eingaben, daher dauert die Eingabe so lange.
In ein boolesches Array (64 Bit) konvertieren, umformen, umkehren, die ersten 8 Byte belegen und zurück in Long konvertieren.
Bonus:
19-Byte- Version in OK, die Sie online testen können !
quelle