Como muitos de vocês provavelmente sabem, as memórias de hardware (endereçáveis por bytes) podem ser divididas em duas categorias - little-endian e big-endian . Nas memórias little-endian, os bytes são numerados começando com 0 no extremo menor (menos significativo) e nas big-endian ao contrário.
Curiosidade : esses termos são baseados no livro de Jonathan Swift , Gulliver's Travels, onde o rei liliputiano ordenou que seus cidadãos quebrassem seus ovos no finalzinho (portanto, os pequenos-finalistas) e os rebeldes os quebrariam no final grande.
Como a troca funciona
Suponha que tenhamos um número inteiro não assinado (32 bits) 12648430
na memória, em uma máquina big-endian com a seguinte aparência:
addr: 0 1 2 3
memory: 00 C0 FF EE
Ao inverter a ordem dos bytes, obtemos o número inteiro hexadecimal 0xEEFFC000
que é 4009738240
decimal.
Sua tarefa
Escreva um programa / função que receba um número inteiro de 32 bits não assinado em decimal e produz o número inteiro resultante ao trocar a endianidade conforme descrito acima.
Regras
- A entrada estará sempre na faixa
0
de4294967295
- A saída pode ser impressa em STDOUT (novas linhas / espaços à direita são bons) ou retornada
- Entrada e saída estão em decimal
- O comportamento na entrada inválida é deixado indefinido
Casos de teste
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
é dado em decimal, mas tecnicamente é em binário em C, por exemplo. É claro que você pode digitar 0x2a
, o que eu queria impedir é aceitar a entrada como uma string "2a"
ou algo parecido.