Seperti yang mungkin Anda ketahui, memori perangkat keras (byte-addressable) dapat dibagi menjadi dua kategori - little-endian dan big-endian . Dalam ingatan little-endian byte-byte diberi nomor dimulai dengan 0 pada akhir yang sedikit (paling tidak signifikan) dan pada yang big-endian sebaliknya.
Fakta menyenangkan : Istilah-istilah ini didasarkan pada buku Jonathan Swift , Gulliver's Travels di mana raja Lilliputian memerintahkan warganya untuk memecahkan telur mereka di ujung kecil (dengan demikian si kecil-endian) dan para pemberontak akan memecahkannya di ujung besar.
Bagaimana swapping bekerja
Misalkan kita memiliki integer unsigned (32bit) 12648430
dalam memori, dalam mesin big-endian yang mungkin terlihat sebagai berikut:
addr: 0 1 2 3
memory: 00 C0 FF EE
Dengan membalik urutan byte kita mendapatkan integer heksadesimal 0xEEFFC000
yang 4009738240
dalam desimal.
Tugas Anda
Tulis program / fungsi yang menerima bilangan bulat 32-bit yang tidak ditandatangani dalam desimal dan mengeluarkan bilangan bulat yang dihasilkan ketika menukar endianness seperti dijelaskan di atas.
Aturan
- Input akan selalu dalam kisaran
0
hingga4294967295
- Output dapat dicetak ke STDOUT (mengikuti baris / spasi baik-baik saja) atau dikembalikan
- Input dan output dalam desimal
- Perilaku pada input yang tidak valid dibiarkan tidak terdefinisi
Uji kasus
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
diberikan dalam desimal tetapi secara teknis itu dalam biner dalam C misalnya. Anda tentu saja dapat mengetik0x2a
, apa yang ingin saya cegah adalah mengambil input sebagai string suka"2a"
atau sejenisnya.Jawaban:
bahasa mesin x86_32, 3 byte
Ini sedikit curang. Konvensi panggilan register Pascal (lihat Wikipedia ) sedikit mirip dengan __fastcall, kecuali ia melewati parameter pertama dalam eax, dan eax juga mengandung nilai balik. Ini juga pembersihan-callee, tetapi karena kita tidak menggunakan stack untuk apa pun selain pointer kembali kita tidak perlu melakukan apa-apa. Ini memungkinkan kita untuk menghindari mov atau xchg dan cukup menggunakan bswap secara langsung.
sumber
bswap
membutuhkan 80486 atau lebih tinggi :)x86_64 bahasa mesin Linux,
54 byteTerima kasih kepada @peter ferrie untuk -1.
Cobalah online!
sumber
C (gcc),
20,2917 bytesaran @ hvd.
Cobalah online!
Jawaban lama;
termasuk harus diimpor.
sumber
Japt ,
1014 byteCobalah
Penjelasan
Konversi integer input ke string basis-16 (
sG
), gunakan0
untuk mengisi awal hingga panjang 8 (ùT8
), pisah menjadi array 2 string karakter (ò
), mundur (w
), bergabung kembali ke string (¬
) dan mengkonversi kembali ke basis- 10 (nG
).sumber
y
itu, ketika diberi fungsi fungsi, menerapkan transformasi normal mereka, menjalankan fungsi, dan kemudian membalikkan transformasi. Dalam hal ini saya pikir itu akan mempersingkat menjadisG_ò w ¬
8 byte. Atau jikaò
melakukannya juga, bisa jadisG_ò2_w
untuk 7 ...&.
keterangan di J melakukan ini dan itu kadang-kadang benar-benar membantu dalam golf. Pengodean dalam semua inversi mungkin membosankan.sG_òw...
, tidak bisa, untuk kehidupan saya, mencari tahu mengapa itu tidak berhasil! Saya akhirnya menyadari kesalahan saya!Jelly , 10 byte
Cobalah online!
sumber
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 byte
Cobalah online!
sumber
i*8
bukani
, mulai darii=24
.x%256
tidak perlu.APL + MENANG 14 byte
Penjelasan
sumber
256⊥⌽⎕⊤⍨4⍴256
bekerja untuk -1 byte?C # ,
7068 byteIni mungkin tidak optimal.
68:
70:
Cobalah online!
sumber
return
ekspresi dan kemudian menggunakan sintaks anggota bertubuh ekspresi:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
untuk 64 byte.0xFF00FF
dua kali oleh>>
ing sebelum&
ing, dan Anda kemudian dapat mempersingkat0xFF00FF
ke~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
untuk 60. Link TIOBahasa Wolfram (Mathematica) , 24 byte
Cobalah online!
Membalik input yang ditafsirkan sebagai bilangan bulat pada basis 256 dengan 4 digit.
sumber
05AB1E ,
1210 byteCobalah online! Penjelasan:
sumber
JavaScript (ES6),
4543 bytesumber
t=0
menghemat 2 byte:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 byte
Cobalah online!
-1 Terima kasih kepada Neil .
Port jawaban Jelly-ku.
sumber
MATL ,
1210 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
JavaScript (ES6),
5145 byteDisimpan 6 byte dengan bantuan @ Neil
Uji kasus
Tampilkan cuplikan kode
sumber
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 byte
Cobalah online!
Berusaha memperpendek ekspresi kanan. Saya pikir saya bisa mencukur beberapa byte dengan membuat ini bekerja dengan versi beta J. Saya bersumpah saya melihat di sini bahwa Anda dapat mengakhiri kereta dengan kata benda dalam versi beta baru ...
Penjelasan
Konversi ke basis 4 digit 256, balikkan digit, lalu konversikan kembali ke desimal. Pada dasarnya, lakukan algoritma yang disediakan di OP. Ini mungkin satu kali di mana itu membantu bahwa konversi basis campuran J mengharuskan Anda untuk menentukan jumlah digit, meskipun itu akan menjadi 2 byte lebih sedikit jika saya bisa mengakhiri kereta dalam kata benda (
(#:~4#256)
sebagai gantinya).sumber
Excel VBA,
10392 BytesFungsi jendela langsung VBE anonim yang mengambil input dari rentang
[A1]
dikonversi ke hex, membalikkan byte, dan output ke jendela langsung VBEsumber
Majelis PPC (32-bit), 8 byte
Bagaimana ini bekerja:
Sayangnya tidak ada emulator perakitan PPC online yang bisa saya temukan untuk didemonstrasikan. Maaf!
sumber
Befunge,
6261 atau 49 byteCobalah online!
Ini menggunakan Befunge standar pada interpreter referensi, dan karenanya kita perlu memperhitungkan fakta bahwa sel-sel memori bertanda 8-bit, dan mengoreksi kemungkinan overflow yang ditandatangani.
Pada implementasi dengan sel-sel memori yang tidak ditandatangani (misalnya PyFunge), atau di mana kisaran lebih besar dari 8 bit (misalnya FBBI), kita dapat pergi tanpa pemeriksaan itu, menghemat 12 byte.
Coba FBBI online!
Coba PyFunge online!
Meskipun perhatikan bahwa PyFunge memiliki input integer pemrosesan bug, jadi saat menguji pada TIO Anda harus mengikuti angka di bidang input dengan spasi atau jeda baris.
sumber
Oktaf , 10 byte
Cobalah online!
Ini mungkin pertama kalinya Octave memiliki skor yang sama persis dengan turunan golfnya, MATL. Tentu saja, dalam hal ini, Octave-lah yang memiliki built-in, bukan MATL, membuatnya jauh lebih mudah.
Menentukan pegangan ke built-in
swapbytes
, yang mengambil tipe data apa pun, menukar endianness dan mengeluarkan hasilnya. Dalam hal ini, inputnya adalah integer unsigned 32-bit.sumber
C #,
4436 byteCobalah online!
Ini awalnya didasarkan pada jawaban C # Polynomial , yang menyarankan saya mengirim jawaban baru dengan perbaikan saya di atasnya, tetapi pendekatan yang diambil dalam jawaban JavaScript Arnauld ternyata lebih pendek di C #.
sumber
R , 86 byte
Saya pikir sudah ada jawaban (atau dua) dalam R untuk pertanyaan ini, tetapi saya pasti salah atau mereka memiliki masalah yang sama dengan R yang tidak menandatangani int. Masalah itu mengeluarkan semua bawaan yang bisa membantu. Saya mencoba konversi 256 basis, tetapi akhirnya terlalu lama, tapi saya pikir masih ada ruang bagi seseorang yang lebih pintar daripada saya untuk melakukan itu. Lalu saya berakhir dengan yang berikut ini yang konversi basis 2 bertukar urutan dalam fungsi rekursif.
Cobalah online!
sumber
R , 41 byte
Cobalah online!
Verifikasi semua kasus uji!
Menggunakan konversi basis-256 seperti yang disarankan MickyT di sini . R tidak memiliki bilangan bulat 32-bit yang tidak ditandatangani, juga tidak memiliki bilangan bulat 64-bit. Ini mencegah kita dari menggunakan operasi bitwise tetapi pendekatan ini (dan kemungkinan MickyT) mungkin masih lebih pendek karena operator bitwise R cukup bertele-tele.
Gunakan nomor 4 tip ini , dengan mempertimbangkan bahwa kami tidak pernah mendapatkan angka sebesar ini
256^4
.n%/%256^(0:3)%%256
mengekstrak byte, dan%*%
, produk matriks, adalah produk titik dalam situasi ini, dengan256^(3:0)
memengaruhi urutan byte yang dibalik.%*%
akan mengembalikan 1x1 yangmatrix
berisi nilai endian-reversed.sumber
Perakitan CP-1610 , 6 DECLEs = 8 byte
Kode ini dimaksudkan untuk dijalankan pada Intellivision .
Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Fungsi ini panjangnya 6 DECLEs, mulai dari $ 480C dan berakhir pada $ 4811.
CP-1610 memiliki register 16-bit, jadi kami menggunakan dua dari mereka (R0 dan R1) untuk menyimpan nilai 32-bit.
Tempat pembuangan eksekusi
sumber
C # (.NET Core) , 72 + 31 = 103 byte
Cobalah online!
+31 untuk
using System;using System.Linq;
Saya berharap untuk menggunakan
Array.Reverse
inline, tetapi itu tidak terjadi (lihat alternatif di bawah).C # (.NET Core) , 87 + 13 = 100 byte
Cobalah online!
+13 untuk
using System;
Solusi perawatan ini dari @JeppeStigNielsen; menghapus pembatasan memiliki semua yang sebaris disimpan 3 byte.
sumber
using System.Linq;
, masih bisa lebih murah untuk digunakanx=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 byte
Cobalah online!
Tidak Terkumpul:
sumber
Swift, 28 byte
sumber
Bahasa mesin ARM Linux, 8 byte
Untuk mencoba ini sendiri, kompilasi dan jalankan yang berikut di Raspberry Pi atau perangkat Android yang menjalankan GNUroot
sumber
Perl 5 , 27 byte
Cobalah online!
sumber
Perl 5
-p
, 21 byteCobalah online!
sumber
K4 , 18 byte
Larutan:
Contoh:
Penjelasan:
Tidak ada int unsigned, jadi butuh input sebagai panjang.
Konversi menjadi boolean array (64bits), membentuk kembali, membalikkan, mengambil 8 byte pertama, mengkonversi kembali menjadi panjang.
Bonus:
Versi 19 byte dalam OK yang dapat Anda Coba online!
sumber