Como la mayoría de ustedes probablemente saben, las memorias de hardware (direccionables por byte) se pueden dividir en dos categorías: little-endian y big-endian . En las memorias little-endian los bytes están numerados comenzando con 0 en el extremo pequeño (menos significativo) y en los big-endian al revés.
Dato curioso : estos términos se basan en el libro de Jonathan Swift , Gulliver's Travels, donde el rey liliputiense ordenó a sus ciudadanos que rompieran sus huevos en el pequeño extremo (por lo tanto, los pequeños endianos) y los rebeldes romperían los suyos en el gran extremo.
Cómo funciona el intercambio
Supongamos que tenemos un entero sin signo (32 bits) 12648430
en la memoria, en una máquina big-endian que podría tener el siguiente aspecto:
addr: 0 1 2 3
memory: 00 C0 FF EE
Al invertir el orden de bytes, obtenemos el entero hexadecimal 0xEEFFC000
que está 4009738240
en decimal.
Tu tarea
Escriba un programa / función que reciba un entero de 32 bits sin signo en decimal y genere el entero resultante al intercambiar el endianness como se describió anteriormente.
Reglas
- La entrada siempre estará en el rango
0
de4294967295
- La salida puede imprimirse en STDOUT (las líneas / espacios finales están bien) o devolverse
- La entrada y la salida están en decimal.
- El comportamiento en la entrada inválida se deja sin definir
Casos de prueba
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
se da en decimal pero técnicamente está en binario en C, por ejemplo. Por supuesto0x2a
, puede escribir , lo que quería evitar es tomar la entrada como una cadena como"2a"
o similar.Respuestas:
lenguaje de máquina x86_32, 3 bytes
Esto es un poco tramposo. La convención de llamadas de registro Pascal (ver Wikipedia ) es un poco como __fastcall, excepto que pasa el primer parámetro en eax, y eax también contiene el valor de retorno. También es una limpieza de llamadas, pero como no usamos la pila para otra cosa que no sea el puntero de retorno, no necesitamos hacer nada. Esto nos permite evitar un mov o xchg y simplemente usar bswap directamente.
fuente
bswap
requiere un 80486 o superior :)x86_64 lenguaje de máquina Linux,
54 bytesGracias a @peter ferrie por -1.
Pruébalo en línea!
fuente
C (gcc)
20,2917 bytesSugerencia de @ hvd.
Pruébalo en línea!
Vieja respuesta;
incluir debe ser de importación.
fuente
Japt ,
1014 bytesIntentalo
Explicación
Convierta el entero de entrada en una cadena de base 16 (
sG
), use0
para rellenar el inicio a la longitud 8 (ùT8
), divida en una matriz de cadenas de 2 caracteres (ò
), invierta (w
), vuelva a unirse a una cadena (¬
) y vuelva a convertir a base- 10 (nG
).fuente
y
esa, cuando se le da una función a una función, aplica su transformación normal, ejecuta la función y luego invierte la transformación. En este caso, creo que eso permitiría acortarlo asG_ò w ¬
8 bytes. O siò
hiciera eso también, incluso podría sersG_ò2_w
por 7 ...&.
adverbio en J hace esto y a veces es realmente útil en el golf. Sin embargo, la codificación en todas las inversiones puede ser tediosa.sG_òw...
no pude, por mi vida, descubrir por qué no funcionaría. ¡Me di cuenta de mis errores eventualmente!Jalea , 10 bytes
Pruébalo en línea!
fuente
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 bytes
Pruébalo en línea!
fuente
i*8
lugar dei
, empezando pori=24
.x%256
no son necesarios.APL + WIN 14 bytes
Explicación
fuente
256⊥⌽⎕⊤⍨4⍴256
Funcionaría para -1 byte?C # ,
7068 bytesEsto probablemente no sea óptimo.
68:
70:
Pruébalo en línea!
fuente
return
expresión y luego usar la sintaxis de miembro con cuerpo de expresión:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
para 64 bytes.0xFF00FF
dos veces>>
ing antes de&
ing, y luego puede acortar0xFF00FF
a~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
por 60. Enlace TIOWolfram Language (Mathematica) , 24 bytes
Pruébalo en línea!
Invierte la entrada interpretada como un entero en la base 256 con 4 dígitos.
fuente
05AB1E ,
1210 bytesPruébalo en línea! Explicación:
fuente
JavaScript (ES6),
4543 bytesfuente
t=0
guardar 2 bytes:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 bytes
Pruébalo en línea!
-1 gracias a Neil .
Puerto de mi respuesta de gelatina.
fuente
MATL ,
1210 bytesPruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
JavaScript (ES6),
5145 bytesGuardado 6 bytes con la ayuda de @ Neil
Casos de prueba
Mostrar fragmento de código
fuente
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
Pruébalo en línea!
Trabajando para acortar la expresión de la mano derecha. Creo que puedo reducir algunos bytes haciendo que esto funcione con una versión beta J. Juro que vi aquí que puedes terminar un tren con un sustantivo en una nueva versión beta ...
Explicación
Convierta a 4 dígitos base 256, invierta los dígitos, luego vuelva a convertir a decimal. Básicamente, realice el algoritmo que se proporciona en el OP. Esta es quizás la única vez en la que es útil que la conversión de base mixta de J requiera que especifiques la cantidad de dígitos, aunque sería 2 bytes menos si pudiera terminar el tren en un sustantivo (en su
(#:~4#256)
lugar).fuente
Excel VBA,
10392 BytesLa función de ventana inmediata anónima de VBE que toma la entrada del rango se
[A1]
convierte en hexadecimal, invierte bytes y sale a la ventana inmediata de VBEfuente
Ensamblaje PPC (32 bits), 8 bytes
Cómo funciona esto:
Desafortunadamente, no hay ningún emulador de ensamblaje PPC en línea que pueda encontrar para demostrar. ¡Lo siento!
fuente
Befunge,
6261 o 49 bytesPruébalo en línea!
Esto está utilizando Befunge estándar en el intérprete de referencia y, por lo tanto, debemos tener en cuenta el hecho de que las celdas de memoria están firmadas de 8 bits y corrigen el posible desbordamiento firmado.
En implementaciones con celdas de memoria sin firmar (por ejemplo, PyFunge), o donde el rango es mayor a 8 bits (por ejemplo, FBBI), podemos escapar sin esas comprobaciones, ahorrando 12 bytes.
¡Prueba FBBI en línea!
¡Prueba PyFunge en línea!
Aunque tenga en cuenta que PyFunge tiene una entrada entera de procesamiento de errores, por lo que al probar en TIO debe seguir el número en el campo de entrada con un espacio o salto de línea.
fuente
Octava , 10 bytes
Pruébalo en línea!
Esta puede ser la primera vez que Octave tiene exactamente el mismo puntaje que su derivado de golf, MATL. Por supuesto, en este caso, es Octave el que tiene incorporado, en lugar de MATL, lo que lo hace mucho más fácil.
Define un identificador para el incorporado
swapbytes
, que toma cualquier tipo de datos, intercambia el endianness y genera el resultado. En este caso, la entrada es un entero sin signo de 32 bits.fuente
C#,
4436 bytesPruébalo en línea!
Esto se basó originalmente en la respuesta C # de Polynomial , quien sugirió que publicara una nueva respuesta con mis mejoras, pero el enfoque adoptado en la respuesta JavaScript de Arnauld resultó ser aún más corto en C #.
fuente
R , 86 bytes
Pensé que ya había una respuesta (o dos) en R para esta pregunta, pero debo haberme equivocado o tenían los mismos problemas que tuve con R sin hacer ints firmados. Ese problema eliminó cualquier cosa que pudiera haber ayudado. Intenté la conversión de 256 bases, pero terminó siendo demasiado larga, pero creo que todavía hay espacio para que alguien más inteligente que yo haga eso. Luego terminé con lo siguiente, que es una conversión de base 2 intercambiando el orden en una función recursiva.
Pruébalo en línea!
fuente
R , 41 bytes
Pruébalo en línea!
¡Verifique todos los casos de prueba!
Utiliza una conversión de base 256 como MickyT sugirió aquí . R no tiene enteros de 32 bits sin signo, ni tiene enteros de 64 bits. Esto nos impide usar operaciones bit a bit, pero este enfoque (y probablemente el de MickyT) probablemente sea aún más corto ya que los operadores bit a bit de R son bastante detallados.
Utiliza el número 4 de este consejo , teniendo en cuenta que nunca obtendremos un número tan grande como
256^4
.n%/%256^(0:3)%%256
extrae los bytes y%*%
, el producto de matriz, es el producto de punto en esta situación, con el256^(3:0)
efecto del orden inverso de bytes.%*%
devolverá un 1x1 quematrix
contiene el valor invertido endian.fuente
Conjunto CP-1610 , 6 DECLE = 8 bytes
Este código está destinado a ejecutarse en una Intellivision .
Un código de operación CP-1610 está codificado con un valor de 10 bits, conocido como 'DECLE'. Esta función tiene 6 DECLEs de largo, desde $ 480C y terminando en $ 4811.
El CP-1610 tiene registros de 16 bits, por lo que estamos utilizando dos de ellos (R0 y R1) para almacenar un valor de 32 bits.
Volcado de ejecución
fuente
C # (.NET Core) , 72 + 31 = 103 bytes
Pruébalo en línea!
+31 para
using System;using System.Linq;
Esperaba usar en
Array.Reverse
línea, pero no fue así (vea la alternativa a continuación).C # (.NET Core) , 87 + 13 = 100 bytes
Pruébalo en línea!
+13 para
using System;
Esta solución se preocupa por @JeppeStigNielsen; eliminando la restricción de tener todo en línea guardado 3 bytes.
fuente
using System.Linq;
, aún puede ser más barato de usarx=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 bytes
Pruébalo en línea!
Sin golf:
fuente
Rápido, 28 bytes
fuente
Lenguaje de máquina ARM Linux, 8 bytes
Para probarlo usted mismo, compile y ejecute lo siguiente en un dispositivo Raspberry Pi o Android con GNUroot
fuente
Perl 5 , 27 bytes
Pruébalo en línea!
fuente
Perl 5
-p
, 21 bytesPruébalo en línea!
fuente
K4 , 18 bytes
Solución:
Ejemplos:
Explicación:
No hay entradas sin signo, por lo que toma la entrada como un largo.
Convierta en matriz booleana (64 bits), cambie la forma, invierta, tome los primeros 8 bytes, vuelva a convertir a largo.
Prima:
Versión de 19 bytes en OK que puedes probar en línea.
fuente