Как многие из вас, вероятно, знают, аппаратная память (с байтовой адресацией) может быть разделена на две категории - с прямым порядком байтов и с прямым порядком байтов . В воспоминаниях с прямым порядком байтов байты нумеруются, начиная с 0 на младшем (наименее значимом) конце, а в старших - наоборот.
Интересный факт : эти термины основаны на книге Джонатана Свифта « Путешествия Гулливера», в которой король-лилипутец приказал своим гражданам разбивать яйца на маленьком конце (таким образом, на маленьких концах), а повстанцы ломали свои яйца на большом конце.
Как работает обмен
Предположим, что у нас есть целое число без знака (32 бита) 12648430
в памяти на машине с прямым порядком байтов, которая может выглядеть следующим образом:
addr: 0 1 2 3
memory: 00 C0 FF EE
Инвертируя порядок байтов, мы получаем шестнадцатеричное целое число, 0xEEFFC000
которое находится 4009738240
в десятичном виде.
Твое задание
Напишите программу / функцию, которая получает беззнаковое 32-битное целое число в десятичном виде и выводит полученное целое число при обмене порядком байтов, как описано выше.
правила
- Input всегда будет находиться в диапазоне
0
от4294967295
- Вывод может быть напечатан в STDOUT (завершающие переводы строки / пробелы в порядке) или возвращены
- Ввод и вывод в десятичном виде
- Поведение при неверном вводе оставлено неопределенным
Контрольные примеры
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
дается в десятичном виде, но технически это в двоичном в C, например. Вы можете, конечно, напечатать0x2a
, что я хотел предотвратить, так это принимать ввод в виде строки"2a"
или тому подобного.Ответы:
машинный язык x86_32, 3 байта
Это немного обмануть. Соглашение о вызовах регистра Pascal (см. Википедия ) немного похоже на __fastcall, за исключением того, что оно передает первый параметр в eax, а eax также содержит возвращаемое значение. Это также очистка callee, но, поскольку мы не используем стек для чего-либо, кроме указателя возврата, нам не нужно ничего делать. Это позволяет нам избегать mov или xchg и просто использовать bswap напрямую.
источник
bswap
машинный язык x86_64 Linux,
54 байтаСпасибо @peter Ferrie за -1.
Попробуйте онлайн!
источник
C (gcc),
20,2917 байтпредложение @ hvd.
Попробуйте онлайн!
Старый ответ;
включать должен быть импорт.
источник
Japt ,
1014 байтовПопытайся
объяснение
Преобразуйте входное целое число в строку base-16 (
sG
), используйте0
для заполнения начала до длины 8 (ùT8
), разбейте на массив из 2-х символьных строк (ò
), reverse (w
), вернитесь в строку (¬
) и преобразуйте обратно в base- 10 (nG
).источник
y
, когда функция получает функцию, применяет их обычное преобразование, запускает функцию и затем инвертирует преобразование. В этом случае я думаю, что это позволило бы сократить его доsG_ò w ¬
8 байтов. Или, если быò
сделал это тоже, это могло бы быть дажеsG_ò2_w
за 7 ...&.
в J делает это, и иногда это действительно полезно в гольфе. Однако кодирование во всех инверсиях может быть утомительным.sG_òw...
мог, на мой взгляд , понять, почему это не сработает! Я понял свою ошибку (ы) в конце концов!Желе , 10 байт
Попробуйте онлайн!
источник
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 байта
Попробуйте онлайн!
источник
i*8
вместоi
, начиная сi=24
.x%256
не нужны.APL + WIN 14 байт
объяснение
источник
256⊥⌽⎕⊤⍨4⍴256
работать на -1 байт?C # ,
7068 байтЭто, вероятно, не оптимально.
68:
70:
Попробуйте онлайн!
источник
return
выражение, а затем использовать синтаксис элемента-выражения в выражении:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
для 64 байтов.0xFF00FF
дважды, используя>>
ing перед тем, как&
ing, а затем можете сократить0xFF00FF
до~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
на 60. СсылкаWolfram Language (Mathematica) , 24 байта
Попробуйте онлайн!
Инвертирует ввод, интерпретируемый как целое число в базе 256 с 4 цифрами.
источник
05AB1E ,
1210 байтПопробуйте онлайн! Объяснение:
источник
JavaScript (ES6),
4543 байтаисточник
t=0
экономит 2 байта:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 байтов
Попробуйте онлайн!
-1 спасибо Нейлу .
Порт моего желе ответа.
источник
MATL ,
1210 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
JavaScript (ES6),
5145 байтСохранено 6 байт с помощью @ Neil
Контрольные примеры
Показать фрагмент кода
источник
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 байт
Попробуйте онлайн!
Работаем над укорочением правого выражения. Я думаю, что смогу сбрить несколько байтов, сделав эту работу с бета-версией J. Клянусь, я видел здесь, что вы можете закончить поезд с существительным в новой бета-версии ...
объяснение
Преобразование в 4-значное основание 256, обратное преобразование цифр и преобразование обратно в десятичное число. В основном, выполните алгоритм, который предоставлен в OP. Возможно, в этот раз полезно, чтобы смешанное базовое преобразование J требовало, чтобы вы указали количество цифр, хотя было бы на 2 байта меньше, если бы я мог закончить поезд в существительном (
(#:~4#256)
вместо).источник
Excel VBA,
10392 байтаФункция анонимного непосредственного окна VBE, которая принимает входные данные из диапазона,
[A1]
преобразует их в шестнадцатеричные, инвертирует байты и выводит в непосредственное окно VBEисточник
Сборка PPC (32-битная), 8 байтов
Как это работает:
К сожалению, нет никаких онлайн-эмуляторов сборки PPC, которые я мог бы продемонстрировать. Сожалею!
источник
Befunge,
6261 или 49 байтовПопробуйте онлайн!
При этом используется стандартный Befunge для эталонного интерпретатора, и поэтому нам необходимо учитывать тот факт, что ячейки памяти имеют 8-битную подпись и корректируют возможное переполнение со знаком.
В реализациях с неподписанными ячейками памяти (например, PyFunge) или с диапазоном, превышающим 8 бит (например, FBBI), мы можем обойтись без этих проверок, сохранив 12 байтов.
Попробуйте ФБР онлайн!
Попробуйте PyFunge онлайн!
Обратите внимание, что в PyFunge есть ошибка обработки целочисленного ввода, поэтому при тестировании на TIO вам нужно следовать за числом в поле ввода с пробелом или переводом строки.
источник
Октава , 10 байт
Попробуйте онлайн!
Это может быть первый раз, когда Octave имеет ту же оценку, что и его производная от гольфа, MATL. Конечно, в данном случае встроенная функция Octave, а не MATL, делает ее намного проще.
Определяет дескриптор для встроенного
swapbytes
, который принимает любой тип данных, меняет порядок байтов и выводит результат. В этом случае вход представляет собой 32-разрядное целое число без знака.источник
C #,
4436 байтПопробуйте онлайн!
Первоначально это было основано на ответе C # Полинома , который предложил мне опубликовать новый ответ с моими улучшениями, но подход, принятый в ответе Арнаулда на JavaScript, оказался еще короче в C #.
источник
R 86 байт
Я думал, что уже есть ответ (или два) в R на этот вопрос, но я, должно быть, ошибся, или у них были те же проблемы, что и у меня, когда R не делал подписанные целые. Эта проблема убрала любые встроенные функции, которые могли бы помочь. Я попробовал 256 базовых преобразований, но это оказалось слишком долгим, но я думаю, что для кого-то умнее меня все еще есть место. Затем я получил следующее преобразование базы 2, поменяв местами порядок в рекурсивной функции.
Попробуйте онлайн!
источник
R , 41 байт
Попробуйте онлайн!
Проверьте все контрольные примеры!
Использует преобразование base-256, как предложено здесь MickyT . В R нет 32-разрядных целых чисел без знака и 64-разрядных чисел. Это мешает нам использовать побитовые операции, но этот подход (и, вероятно, MickyT), вероятно, все еще короче, поскольку побитовые операторы R довольно многословны.
Использует номер 4 этого совета , учитывая, что мы никогда не получим такое большое число, как
256^4
.n%/%256^(0:3)%%256
извлекает байты, и%*%
, матричный продукт, является точечным произведением в этой ситуации, с256^(3:0)
влиянием обратного порядка байтов.%*%
вернет 1x1,matrix
содержащий значение с обратным порядком байтовисточник
Сборка CP-1610 , 6 DECLE = 8 байт
Этот код предназначен для запуска на Intellivision .
Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Эта функция имеет длину 6 DECLE, начиная с 480C и заканчивая 4811.
CP-1610 имеет 16-битные регистры, поэтому мы используем два из них (R0 и R1) для хранения 32-битного значения.
Выполнение дампа
источник
C # (.NET Core) , 72 + 31 = 103 байта
Попробуйте онлайн!
+31 для
using System;using System.Linq;
Я надеялся использовать
Array.Reverse
inline, но этого не произошло (см. Альтернативу ниже).C # (.NET Core) , 87 + 13 = 100 байт
Попробуйте онлайн!
+13 за
using System;
Это решение заботится о @JeppeStigNielsen; снятие ограничения на сохранение всего встроенного в 3 байта.
источник
using System.Linq;
, он все еще может быть дешевле в использованииx=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 байта
Попробуйте онлайн!
Ungolfed:
источник
Swift, 28 байт
источник
ARM машинный язык Linux, 8 байт
Попробуйте сами, скомпилируйте и запустите следующее на устройстве Raspberry Pi или Android под управлением GNUroot
источник
Perl 5 , 27 байт
Попробуйте онлайн!
источник
Perl 5
-p
, 21 байтПопробуйте онлайн!
источник
К4 , 18 байт
Решение:
Примеры:
Объяснение:
Нет беззнаковых целых, поэтому принимает входные данные как длинные.
Преобразовать в логический массив (64 бита), изменить форму, обратить вспять, взять первые 8 байтов, преобразовать обратно в long.
Бонус:
19-байтовая версия в ОК, которую вы можете попробовать онлайн!
источник