- Fundamentos de Bases Numéricas
- O Exercício add_chelou
- Mapeamento das Bases
- Algoritmo de Conversão
- Exemplos Resolvidos
- Implementação em Shell
- Referências
Uma base numérica define quantos símbolos distintos usamos para representar números. Cada posição em um número tem um peso que é uma potência da base.
O sistema que usamos no dia a dia:
2345₁₀ = 2×10³ + 3×10² + 4×10¹ + 5×10⁰
= 2×1000 + 3×100 + 4×10 + 5×1
= 2000 + 300 + 40 + 5
= 2345
| Posição | 3 | 2 | 1 | 0 |
|---|---|---|---|---|
| Dígito | 2 | 3 | 4 | 5 |
| Peso | 10³ | 10² | 10¹ | 10⁰ |
| Valor | 1000 | 100 | 10 | 1 |
Para qualquer base B:
número = dₙ×Bⁿ + dₙ₋₁×Bⁿ⁻¹ + ... + d₁×B¹ + d₀×B⁰
Onde:
- dᵢ = dígito na posição i
- B = base numérica
- n = número de dígitos - 1
| Potência | Base 2 | Base 5 | Base 10 | Base 13 | Base 16 |
|---|---|---|---|---|---|
| x⁰ | 1 | 1 | 1 | 1 | 1 |
| x¹ | 2 | 5 | 10 | 13 | 16 |
| x² | 4 | 25 | 100 | 169 | 256 |
| x³ | 8 | 125 | 1000 | 2197 | 4096 |
| x⁴ | 16 | 625 | 10000 | 28561 | 65536 |
| x⁵ | 32 | 3125 | 100000 | 371293 | 1048576 |
| x⁶ | 64 | 15625 | 1000000 | 4826809 | 16777216 |
| x⁷ | 128 | 78125 | 10000000 | 62748517 | 268435456 |
Escreva uma linha de comando que:
- Recebe números de
FT_NBR1na base '"?! - Recebe números de
FT_NBR2na base mrdoc - Exibe a soma na base gtaio luSnemf
FT_NBR1 (base '\"?!) → [mapear '\"?! → 01234] → converter base 5 → 10
↓
FT_NBR2 (base mrdoc) → [mapear mrdoc → 01234] → converter base 5 → 10
↓
SOMAR (decimal)
↓
converter base 10 → 13
↓
[mapear 0-12 → gtaio luSnemf]
↓
RESULTADO
| Caractere | Valor | Descrição |
|---|---|---|
' |
0 | Aspas simples |
\ |
1 | Barra invertida |
" |
2 | Aspas duplas |
? |
3 | Interrogação |
! |
4 | Exclamação |
| Caractere | Valor |
|---|---|
m |
0 |
r |
1 |
d |
2 |
o |
3 |
c |
4 |
| Valor | Caractere | Observação |
|---|---|---|
| 0 | g |
|
| 1 | t |
|
| 2 | a |
|
| 3 | i |
|
| 4 | o |
|
| 5 | |
ESPAÇO |
| 6 | l |
|
| 7 | u |
|
| 8 | S |
Maiúsculo |
| 9 | n |
|
| 10 | e |
|
| 11 | m |
|
| 12 | f |
Atenção: A posição 5 é um espaço em branco, não um caractere visível.
Algoritmo:
- Identifique cada dígito dᵢ (da direita para a esquerda, começando em i=0)
- Calcule: resultado = Σ(dᵢ × baseⁱ)
Exemplo: 423₅ para base 10
423₅ = 4×5² + 2×5¹ + 3×5⁰
= 4×25 + 2×5 + 3×1
= 100 + 10 + 3
= 113₁₀
Algoritmo (divisão sucessiva):
- Divida o número N pela base B
- Guarde o resto
- Atualize N = quociente
- Repita até N = 0
- Inverta a sequência de restos
Exemplo: 113₁₀ para base 5
113 ÷ 5 = 22 resto 3
22 ÷ 5 = 4 resto 2
4 ÷ 5 = 0 resto 4
Restos (invertidos): 4, 2, 3 → 423₅
FUNÇÃO converter_e_somar(FT_NBR1, FT_NBR2):
// Etapa 1: Mapear caracteres customizados → dígitos 0-4
nbr1_base5 = mapear(FT_NBR1, "'\"?!" → "01234")
nbr2_base5 = mapear(FT_NBR2, "mrdoc" → "01234")
// Etapa 2: Converter base 5 → base 10
decimal1 = converter_para_base10(nbr1_base5, base=5)
decimal2 = converter_para_base10(nbr2_base5, base=5)
// Etapa 3: Somar em decimal
soma = decimal1 + decimal2
// Etapa 4: Converter base 10 → base 13
resultado_base13 = converter_para_base13(soma)
// Etapa 5: Mapear dígitos 0-12 → caracteres customizados
resultado_final = mapear(resultado_base13, "0123456789ABC" → "gtaio luSnemf")
RETORNAR resultado_final
FT_NBR1=\'?"\"'\
FT_NBR2=rcrdmdddPasso 1: Converter FT_NBR1
Mapeamento '\"?! → 01234:
\ ' ? " \ ' \
1 0 3 2 1 0 1 → 10321201₅
Conversão para base 10:
10321201₅ = 1×5⁷ + 0×5⁶ + 3×5⁵ + 2×5⁴ + 1×5³ + 2×5² + 0×5¹ + 1×5⁰
= 78125 + 0 + 9375 + 1250 + 125 + 50 + 0 + 1
= 88926₁₀
Passo 2: Converter FT_NBR2
Mapeamento mrdoc → 01234:
r c r d m d d d
1 4 1 2 0 2 2 2 → 14120222₅
Conversão para base 10:
14120222₅ = 1×5⁷ + 4×5⁶ + 1×5⁵ + 2×5⁴ + 0×5³ + 2×5² + 2×5¹ + 2×5⁰
= 78125 + 62500 + 3125 + 1250 + 0 + 50 + 10 + 2
= 145062₁₀
Passo 3: Somar
88926 + 145062 = 233988₁₀
Passo 4: Converter para base 13
233988 ÷ 13 = 17999 resto 1
17999 ÷ 13 = 1384 resto 7
1384 ÷ 13 = 106 resto 6
106 ÷ 13 = 8 resto 2
8 ÷ 13 = 0 resto 8
Restos (invertidos): 8, 2, 6, 7, 1 → 82671₁₃
Passo 5: Mapear para caracteres
Mapeamento 0123456789ABC → gtaio luSnemf:
8 2 6 7 1
S a l u t
Salut
FT_NBR1=\"\"! \"\"! \"\"!\"\"!\"\"!\"\"
FT_NBR2=dcrcmcmooododmrrrmorcmcrmomoPasso 1: Converter FT_NBR1
Mapeamento:
\ " " ! " " ! " " ! " " ! " " ! " "
1 2 2 4 2 2 4 2 2 4 2 2 4 2 2 4 2 2 → 122422422422422422₅
Conversão (calculando):
122422422422422422₅ = 1×5¹⁷ + 2×5¹⁶ + 2×5¹⁵ + ... (valor muito grande)
Passo 2: Converter FT_NBR2
Mapeamento:
dcrcmcmooododmrrrmorcmcrmomo → 2414040332320100304040103030₅
Passo 3: Somar e converter para base 13
O resultado final mapeia para: Segmentation fault
#!/bin/bash
# Mapeando FT_NBR1: base '\"?! → dígitos 0-4
NBR1=$(echo $FT_NBR1 | tr \'\\\"?\! 01234)
# Mapeando FT_NBR2: base mrdoc → dígitos 0-4
NBR2=$(echo $FT_NBR2 | tr mrdoc 01234)
# Convertendo base 5 → base 10, somando, e convertendo para base 13
# bc usa letras A-C para representar 10-12 em bases > 10
RESULT=$(echo "ibase=5; obase=D; $NBR1 + $NBR2" | bc)
# Mapeando base 13 (0-9A-C) → caracteres customizados gtaio luSnemf
echo $RESULT | tr 0123456789ABC 'gtaio luSnemf'Substitui caracteres:
echo "abc" | tr abc 123 # Saída: 123Calculadora que suporta múltiplas bases:
ibase=N: define base de entradaobase=N: define base de saída- Bases válidas: 2-16
- Base 13 em
obase: representada comoD(hexadecimal)
Em shell, alguns caracteres precisam de escape:
\' # Aspas simples
\\ # Barra invertida
\" # Aspas duplas
\! # Exclamaçãoecho $(echo "ibase=5; obase=D; $(echo $FT_NBR1 | tr \'\\\"?\! 01234) + $(echo $FT_NBR2 | tr mrdoc 01234)" | bc) | tr 0123456789ABC 'gtaio luSnemf'# Definir variáveis
export FT_NBR1=\'?"\"'\
export FT_NBR2=rcrdmddd
# Executar script
./add_chelou.sh
# Saída esperada:
# Salut- Sistemas de numeração posicional: cada dígito tem um peso baseado na sua posição
- Conversão de bases: algoritmos de divisão/multiplicação sucessiva
- Notação científica: representação compacta usando potências
| Base | Nome | Dígitos | Uso |
|---|---|---|---|
| 2 | Binário | 0-1 | Computação digital |
| 8 | Octal | 0-7 | Permissões Unix |
| 10 | Decimal | 0-9 | Uso cotidiano |
| 16 | Hexadecimal | 0-9, A-F | Endereços de memória, cores |
| 64 | Base64 | A-Z, a-z, 0-9, +, / | Codificação de dados |
Para validar conversões manualmente:
# Converter de base 5 para base 10
echo "ibase=5; 10321201" | bc
# Converter de base 10 para base 13
echo "obase=D; 233988" | bc
# Verificar potências
echo "5^7" | bc # Resultado: 78125- Atenção ao espaço: O caractere na posição 5 da base de saída é um espaço, não visível
- Escapes corretos: Caracteres especiais (
\,",!) precisam de escape no shell - Ordem dos restos: Na conversão base 10 → base N, os restos devem ser invertidos
- Base do bc: Para base 13, use
obase=D(D = 13 em hexadecimal)
- ❌ Esquecer que
bcusa letras A-C para representar 10-12 - ❌ Não inverter os restos ao converter de decimal para outra base
- ❌ Confundir a ordem das potências (maior potência à esquerda)
- ❌ Ignorar o espaço na base de saída
- Mapeamento de caracteres correto
- Conversão base 5 → 10 validada manualmente
- Soma em decimal conferida
- Conversão base 10 → 13 validada
- Mapeamento final incluindo espaço
- Teste com ambos os exemplos do enunciado
Autor: drewdomi
Data: 2026-01-15
Repositório: GitHub Gist
Este documento é de domínio público. Use, modifique e distribua livremente.