Jak zapewne większość z was wie, pamięć sprzętową (adresowalną bajtowo) można podzielić na dwie kategorie - little-endian i big-endian . W pamięciach little-endian bajty są ponumerowane zaczynając od 0 na małym (najmniej znaczącym) końcu, a w big-endian na odwrót.
Ciekawostka : Warunki te oparte są na książce Jonathana Swifta Podróż Guliwera, w której król Lilliputian nakazał swoim obywatelom rozbić jaja na małym końcu (a więc na małych endianach), a rebelianci rozbili ich na wielkim końcu.
Jak działa zamiana
Załóżmy, że mamy 12648430
w pamięci liczbę całkowitą bez znaku (32-bitową) w maszynie typu big-endian, która może wyglądać następująco:
addr: 0 1 2 3
memory: 00 C0 FF EE
Odwracając kolejność bajtów, otrzymujemy liczbę szesnastkową, 0xEEFFC000
która jest 4009738240
dziesiętna.
Twoje zadanie
Napisz program / funkcję, która odbiera 32-bitową liczbę całkowitą bez znaku w systemie dziesiętnym i wyświetla wynikową liczbę całkowitą podczas zamiany endianizmu, jak opisano powyżej.
Zasady
- Dane wejściowe zawsze będą w zakresie
0
do4294967295
- Dane wyjściowe można wydrukować do STDOUT (końcowe znaki nowej linii / spacje są w porządku) lub zwrócić
- Dane wejściowe i wyjściowe są dziesiętne
- Zachowanie w przypadku nieprawidłowych danych wejściowych pozostaje niezdefiniowane
Przypadki testowe
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
jest podawany w postaci dziesiętnej, ale technicznie jest on na przykład dwójkowy w C. Możesz oczywiście wpisać0x2a
, co chciałem zapobiec, biorąc dane wejściowe jako ciąg znaków"2a"
lub podobny.Odpowiedzi:
język maszynowy x86_32, 3 bajty
To trochę oszustwo. Konwencja wywoływania rejestru Pascal (patrz Wikipedia ) jest trochę podobna do __fastcall, z tym wyjątkiem, że przekazuje pierwszy parametr w eax, a eax zawiera również wartość zwracaną. Jest to również czyszczenie callee, ale ponieważ nie używamy stosu do niczego innego niż wskaźnik powrotu, nie musimy nic robić. To pozwala nam uniknąć mov lub xchg i po prostu użyć bswap bezpośrednio.
źródło
bswap
wymaga to wersji 80486 lub wyższej :)x86_64 język maszynowy Linux,
54 bajtówDzięki @peter ferrie za -1.
Wypróbuj online!
źródło
C (gcc),
20,2917 bajtówsugestia @ hvd.
Wypróbuj online!
Stara odpowiedź;
należy dołączyć.
źródło
Japt ,
1014 bajtówSpróbuj
Wyjaśnienie
Konwertuj wejściową liczbę całkowitą na ciąg 16 (
sG
), użyj,0
aby wstawić początek na długość 8 (ùT8
), podziel na tablicę 2 ciągów znaków (ò
), reverse (w
), połącz ponownie w ciąg (¬
) i przekonwertuj z powrotem na base- 10 (nG
).źródło
y
, gdy dana funkcja ma funkcję, zastosuje jej normalną transformację, uruchom funkcję, a następnie odwróci transformację. W tym przypadku myślę, że pozwoliłoby to zostać skrócone dosG_ò w ¬
8 bajtów. A jeśli toò
zrobi, może być nawetsG_ò2_w
na 7 ...&.
przysłówek w J robi to i to czasem bardzo pomocne w golfa. Kodowanie we wszystkich inwersjach może być jednak uciążliwe.sG_òw...
mogłem, przez całe życie, dowiedzieć się, dlaczego to nie zadziała! W końcu zdałem sobie sprawę z moich błędów!Galaretka , 10 bajtów
Wypróbuj online!
źródło
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 bajty
Wypróbuj online!
źródło
i*8
zamiasti
, zaczynając odi=24
.x%256
nie są konieczne.APL + WIN 14 bajtów
Wyjaśnienie
źródło
256⊥⌽⎕⊤⍨4⍴256
działałby dla -1 bajtów?C # ,
7068 bajtówTo prawdopodobnie nie jest optymalne.
68:
70:
Wypróbuj online!
źródło
return
wyrażenia, a następnie użyć składni składowej wyrażenia:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
dla 64 bajtów.0xFF00FF
dwa razy>>
ing, zanim&
wejdziesz, a następnie możesz skrócić0xFF00FF
do~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
za 60. TIO linkWolfram Language (Mathematica) , 24 bajty
Wypróbuj online!
Odwraca wejście interpretowane jako liczba całkowita w podstawie 256 z 4 cyframi.
źródło
05AB1E ,
1210 bajtówWypróbuj online! Wyjaśnienie:
źródło
JavaScript (ES6),
4543 bajtówźródło
t=0
zapisania 2 bajtów:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 bajtów
Wypróbuj online!
-1 dzięki Neilowi .
Port mojej galaretki odpowiedzi.
źródło
MATL ,
1210 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
JavaScript (ES6),
5145 bajtówZapisano 6 bajtów z pomocą @ Neila
Przypadki testowe
Pokaż fragment kodu
źródło
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 bajtów
Wypróbuj online!
Praca nad skróceniem ekspresji prawej ręki. Myślę, że mogę zmniejszyć liczbę bajtów, wprowadzając tę wersję w wersji beta J. Przysięgam, widziałem tutaj, że możesz zakończyć pociąg rzeczownikiem w nowej wersji beta ...
Wyjaśnienie
Konwertuj na 4 cyfry, podstawa 256, odwróć cyfry, a następnie przekonwertuj z powrotem na dziesiętne. Zasadniczo wykonaj algorytm podany w OP. Być może jest to jeden raz, kiedy pomocne jest, aby mieszana konwersja bazy J wymagała określenia liczby cyfr, chociaż byłoby to o 2 mniej bajtów, gdybym mógł zakończyć pociąg rzeczownikiem (
(#:~4#256)
zamiast tego).źródło
Excel VBA,
10392 bajtówAnonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu
[A1]
do postaci szesnastkowej, odwraca bajty i wysyła dane do bezpośredniego okna VBEźródło
Zestaw PPC (32-bit), 8 bajtów
Jak to działa:
Niestety nie ma żadnych emulatorów asemblera PPC w Internecie, które mógłbym wykazać. Przepraszam!
źródło
Befunge,
6261 lub 49 bajtówWypróbuj online!
Korzysta to ze standardowego Befunge na interpretatorze referencyjnym, dlatego musimy wziąć pod uwagę fakt, że komórki pamięci są podpisane 8-bitowo i poprawić ewentualne przepełnienie podpisu.
W implementacjach z niepodpisanymi komórkami pamięci (np. PyFunge) lub gdy zasięg jest większy niż 8 bitów (np. FBBI), możemy uciec bez tych kontroli, oszczędzając 12 bajtów.
Wypróbuj FBBI online!
Wypróbuj PyFunge online!
Chociaż zauważ, że PyFunge ma błąd przetwarzania liczb całkowitych, więc podczas testowania na TIO musisz podążać za liczbą w polu wprowadzania ze spacją lub łamaniem linii.
źródło
Oktawa , 10 bajtów
Wypróbuj online!
To może być pierwszy raz, gdy Octave ma dokładnie taki sam wynik jak jego golfowa pochodna, MATL. Oczywiście w tym przypadku to Octave ma wbudowane, a nie MATL, co znacznie ułatwia.
Definiuje uchwyt do wbudowanego
swapbytes
, który przyjmuje dowolny typ danych, zamienia endianness i wyświetla wynik. W tym przypadku wejściem jest 32-bitowa liczba całkowita bez znaku.źródło
DO#,
4436 bajtówWypróbuj online!
Pierwotnie było to oparte na odpowiedzi C # firmy Polynomial , która zasugerowała opublikowanie nowej odpowiedzi z moimi ulepszeniami, ale podejście zastosowane w odpowiedzi JavaScript Arnaulda okazało się jeszcze krótsze w języku C #.
źródło
R , 86 bajtów
Myślałem, że w R jest już odpowiedź (lub dwie) na to pytanie, ale musiałem się pomylić lub mieli te same problemy, które miałem z R, że nie robiłem podpisanych int. Ten problem usunął wszystkie wbudowane elementy, które mogłyby pomóc. Próbowałem konwersji 256 bazowej, ale zakończyło się to zbyt długo, ale myślę, że jest jeszcze miejsce dla kogoś mądrzejszego ode mnie. Potem skończyło się na tym, że konwersja base 2 zamienia kolejność w funkcji rekurencyjnej.
Wypróbuj online!
źródło
R , 41 bajtów
Wypróbuj online!
Sprawdź wszystkie przypadki testowe!
Używa base-256 konwersję jako MickyT sugerowanej tutaj . R nie ma 32-bitowych liczb całkowitych bez znaku ani 64-bitowych liczb całkowitych. To uniemożliwia nam korzystanie z operacji bitowych, ale to podejście (i prawdopodobnie MickyT) jest prawdopodobnie jeszcze krótsze, ponieważ operatory bitowe R są dość gadatliwe.
Wykorzystuje numer 4 tej wskazówki , biorąc pod uwagę, że nigdy nie otrzymamy liczby tak dużej jak
256^4
.n%/%256^(0:3)%%256
wyodrębnia bajty, a%*%
iloczyn macierzowy jest iloczynem kropkowym w tej sytuacji, z256^(3:0)
zachowaniem odwróconej kolejności bajtów.%*%
zwróci 1x1matrix
zawierający wartość odwróconą przez endian.źródło
Zespół CP-1610 , 6 DECLE = 8 bajtów
Ten kod jest przeznaczony do uruchamiania na Intellivision .
Kod operacji CP-1610 jest kodowany za pomocą 10-bitowej wartości, zwanej „DECLE”. Ta funkcja ma 6 DECLE długości, zaczynając od 480 $ C, a kończąc na 4811 $.
CP-1610 ma rejestry 16-bitowe, więc używamy dwóch z nich (R0 i R1) do przechowywania wartości 32-bitowej.
Zrzut wykonania
źródło
C # (.NET Core) , 72 + 31 = 103 bajty
Wypróbuj online!
+31 za
using System;using System.Linq;
Miałem nadzieję użyć
Array.Reverse
inline, ale tak nie było (patrz alternatywa poniżej).C # (.NET Core) , 87 + 13 = 100 bajtów
Wypróbuj online!
+13 dla
using System;
To rozwiązanie obsługuje @JeppeStigNielsen; usunięcie ograniczenia polegającego na tym, że wszystko w linii zostało zapisane 3 bajty.
źródło
using System.Linq;
, korzystanie z niego może być tańszex=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 bajty
Wypróbuj online!
Nie golfowany:
źródło
Szybki, 28 bajtów
źródło
Język maszynowy ARM Linux, 8 bajtów
Aby wypróbować to samodzielnie, skompiluj i uruchom poniższe na urządzeniu Raspberry Pi lub Android z systemem GNUroot
źródło
Perl 5 , 27 bajtów
Wypróbuj online!
źródło
Perl 5
-p
, 21 bajtówWypróbuj online!
źródło
K4 , 18 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Nie ma żadnych znaków całkowitych bez znaku, więc dane wejściowe są tak długie.
Konwertuj na tablicę boolowską (64 bity), przekształcaj, odwracaj, bierz pierwsze 8 bajtów, konwertuj z powrotem na długie.
Premia:
Wersja 19-bajtowa w OK, którą możesz wypróbować online!
źródło