{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Números\n", "\n", "## Sistemas de Números" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sistema decimal é o sistema numérico mais utilizado. Mas o computador entende apenas binário. \n", "\n", "Os sistemas de números **binários**, **octais** e **hexadecimais** estão intimamente relacionados e podemos exigir a conversão de decimal nesses sistemas. \n", "\n", "O sistema decimal é a base 10 (dez símbolos, 0-9, são usados para representar um número) e, da mesma forma: \n", "\n", "- binário é a base 2, \n", "- octal é a base 8 \n", "- hexadecimal é a base 16.\n", "\n", "Um número com o prefixo '0b' é considerado **binário**, '0o' é considerado **octal** e '0x' como **hexadecimal**. \n", "\n", "Por exemplo:\n", "\n", "- **Decimal** = `112` \n", "- **Binário** = `0b1110000`\n", "- **Octal** = `0o160`\n", "- **Hexadecimal** = `0x70`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos definir um número decimal para executarmos conversões" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Versão decimal: 8\n", "Versão binária: 0b1000\n", "Versão octal: 0o10\n", "Versão hexadecimal: 0x8\n" ] } ], "source": [ "decimal = 8\n", "\n", "print(f'Versão decimal: {decimal}')\n", "print(f'Versão binária: {bin(decimal)}')\n", "print(f'Versão octal: {oct(decimal)}')\n", "print(f'Versão hexadecimal: {hex(decimal)}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Utilizando F-Strings para Conversões \n", "\n", "Vamos novamente definir um número decimal e fazer conversões" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decimal: 255.00\n", "Hexadecimal: ff\n", "Binário: 11111111\n", "Octal: 377\n", "Científico: 2.550000e+02\n" ] } ], "source": [ "dec = 255\n", "\n", "print(f'Decimal: {dec:.2f}')\n", "print(f'Hexadecimal: {dec:x}')\n", "print(f'Binário: {dec:b}')\n", "print(f'Octal: {dec:o}')\n", "print(f'Científico: {dec:e}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Manipulação de Binários\n", "\n", "Vejamos informações e objetivos relacionados à manipulação de bits em Python (manipulação binária).\n", "\n", "Algumas tarefas incluem:\n", "\n", "- Transformar \"11011000111101 ...\" em bytes (preenchido à esquerda ou à direita, 0 ou 1) e vice-versa.\n", "- Intervalos de fatia de bits\n", "- Gire os bits, endereçados pelo bit. Ou seja, digamos: \"gire os bits 13-17, envolvendo as bordas\" ou \"gire os bits 13-17, perca os bits de um lado, defina todos os novos bits como 0\".\n", "- Da mesma forma, reverta regiões de bits, aplique lógica a regiões de bits, etc.\n", "- Alterne Endianness, com diferentes tamanhos de bloco.\n", "- Aplique operações em agrupamentos de blocos: ex: aplique XOR 10101 (5 bits) repetidamente em um campo.\n", "\n", "### Manipulações\n", "\n", "#### Binário para Inteiro Decimal" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "33" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('00100001', 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Binário para Hexadecimal" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ff\n" ] } ], "source": [ "print(f'{int(\"11111111\", 2):x}')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1b6\n" ] } ], "source": [ "print(f'{int(\"0110110110\", 2):x}')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7f\n" ] } ], "source": [ "print(f'{int(\"01111111\", 2):x}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Para character (máximo 8 bits)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "';'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('111011', 2))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'v'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('1110110', 2))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'w'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('1110111', 2))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'~'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('01111110', 2))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'?'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('111111', 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Character para inteiros" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "254" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('11111110', 2)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'þ'" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('11111110', 2))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "254" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ord('þ')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "112" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ord('p')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'p'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chr(int('1110000', 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Bits Individuais" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 0" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 1" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 2" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 3" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 4" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "256" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 << 8" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### String Hex para Inteiro Decimal" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "255" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('0xff', 16)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('0x10', 16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### String Oct para Inteiro Decimal" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "112" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('0o160', 8)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "31" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('0o037', 8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Inteiro para String Binária" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "def bin(s):\n", " return str(s) if s<=1 else bin(s>>1) + str(s&1)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'11'" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bin(3)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1000110'" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bin(70)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'11111111'" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bin(255)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tabela de Números" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "from prettytable import PrettyTable" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "tabela = PrettyTable()" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [], "source": [ "tabela.field_names = [\"Decimal\", \"Hexadecimal\", \"Octal\", \"Binário\"]" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "for n in range(128):\n", " tabela.add_row([n, hex(n), oct(n), bin(n)])" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+---------+-------------+-------+---------+\n", "| Decimal | Hexadecimal | Octal | Binário |\n", "+---------+-------------+-------+---------+\n", "| 0 | 0x0 | 0o0 | 0 |\n", "| 1 | 0x1 | 0o1 | 1 |\n", "| 2 | 0x2 | 0o2 | 10 |\n", "| 3 | 0x3 | 0o3 | 11 |\n", "| 4 | 0x4 | 0o4 | 100 |\n", "| 5 | 0x5 | 0o5 | 101 |\n", "| 6 | 0x6 | 0o6 | 110 |\n", "| 7 | 0x7 | 0o7 | 111 |\n", "| 8 | 0x8 | 0o10 | 1000 |\n", "| 9 | 0x9 | 0o11 | 1001 |\n", "| 10 | 0xa | 0o12 | 1010 |\n", "| 11 | 0xb | 0o13 | 1011 |\n", "| 12 | 0xc | 0o14 | 1100 |\n", "| 13 | 0xd | 0o15 | 1101 |\n", "| 14 | 0xe | 0o16 | 1110 |\n", "| 15 | 0xf | 0o17 | 1111 |\n", "| 16 | 0x10 | 0o20 | 10000 |\n", "| 17 | 0x11 | 0o21 | 10001 |\n", "| 18 | 0x12 | 0o22 | 10010 |\n", "| 19 | 0x13 | 0o23 | 10011 |\n", "| 20 | 0x14 | 0o24 | 10100 |\n", "| 21 | 0x15 | 0o25 | 10101 |\n", "| 22 | 0x16 | 0o26 | 10110 |\n", "| 23 | 0x17 | 0o27 | 10111 |\n", "| 24 | 0x18 | 0o30 | 11000 |\n", "| 25 | 0x19 | 0o31 | 11001 |\n", "| 26 | 0x1a | 0o32 | 11010 |\n", "| 27 | 0x1b | 0o33 | 11011 |\n", "| 28 | 0x1c | 0o34 | 11100 |\n", "| 29 | 0x1d | 0o35 | 11101 |\n", "| 30 | 0x1e | 0o36 | 11110 |\n", "| 31 | 0x1f | 0o37 | 11111 |\n", "| 32 | 0x20 | 0o40 | 100000 |\n", "| 33 | 0x21 | 0o41 | 100001 |\n", "| 34 | 0x22 | 0o42 | 100010 |\n", "| 35 | 0x23 | 0o43 | 100011 |\n", "| 36 | 0x24 | 0o44 | 100100 |\n", "| 37 | 0x25 | 0o45 | 100101 |\n", "| 38 | 0x26 | 0o46 | 100110 |\n", "| 39 | 0x27 | 0o47 | 100111 |\n", "| 40 | 0x28 | 0o50 | 101000 |\n", "| 41 | 0x29 | 0o51 | 101001 |\n", "| 42 | 0x2a | 0o52 | 101010 |\n", "| 43 | 0x2b | 0o53 | 101011 |\n", "| 44 | 0x2c | 0o54 | 101100 |\n", "| 45 | 0x2d | 0o55 | 101101 |\n", "| 46 | 0x2e | 0o56 | 101110 |\n", "| 47 | 0x2f | 0o57 | 101111 |\n", "| 48 | 0x30 | 0o60 | 110000 |\n", "| 49 | 0x31 | 0o61 | 110001 |\n", "| 50 | 0x32 | 0o62 | 110010 |\n", "| 51 | 0x33 | 0o63 | 110011 |\n", "| 52 | 0x34 | 0o64 | 110100 |\n", "| 53 | 0x35 | 0o65 | 110101 |\n", "| 54 | 0x36 | 0o66 | 110110 |\n", "| 55 | 0x37 | 0o67 | 110111 |\n", "| 56 | 0x38 | 0o70 | 111000 |\n", "| 57 | 0x39 | 0o71 | 111001 |\n", "| 58 | 0x3a | 0o72 | 111010 |\n", "| 59 | 0x3b | 0o73 | 111011 |\n", "| 60 | 0x3c | 0o74 | 111100 |\n", "| 61 | 0x3d | 0o75 | 111101 |\n", "| 62 | 0x3e | 0o76 | 111110 |\n", "| 63 | 0x3f | 0o77 | 111111 |\n", "| 64 | 0x40 | 0o100 | 1000000 |\n", "| 65 | 0x41 | 0o101 | 1000001 |\n", "| 66 | 0x42 | 0o102 | 1000010 |\n", "| 67 | 0x43 | 0o103 | 1000011 |\n", "| 68 | 0x44 | 0o104 | 1000100 |\n", "| 69 | 0x45 | 0o105 | 1000101 |\n", "| 70 | 0x46 | 0o106 | 1000110 |\n", "| 71 | 0x47 | 0o107 | 1000111 |\n", "| 72 | 0x48 | 0o110 | 1001000 |\n", "| 73 | 0x49 | 0o111 | 1001001 |\n", "| 74 | 0x4a | 0o112 | 1001010 |\n", "| 75 | 0x4b | 0o113 | 1001011 |\n", "| 76 | 0x4c | 0o114 | 1001100 |\n", "| 77 | 0x4d | 0o115 | 1001101 |\n", "| 78 | 0x4e | 0o116 | 1001110 |\n", "| 79 | 0x4f | 0o117 | 1001111 |\n", "| 80 | 0x50 | 0o120 | 1010000 |\n", "| 81 | 0x51 | 0o121 | 1010001 |\n", "| 82 | 0x52 | 0o122 | 1010010 |\n", "| 83 | 0x53 | 0o123 | 1010011 |\n", "| 84 | 0x54 | 0o124 | 1010100 |\n", "| 85 | 0x55 | 0o125 | 1010101 |\n", "| 86 | 0x56 | 0o126 | 1010110 |\n", "| 87 | 0x57 | 0o127 | 1010111 |\n", "| 88 | 0x58 | 0o130 | 1011000 |\n", "| 89 | 0x59 | 0o131 | 1011001 |\n", "| 90 | 0x5a | 0o132 | 1011010 |\n", "| 91 | 0x5b | 0o133 | 1011011 |\n", "| 92 | 0x5c | 0o134 | 1011100 |\n", "| 93 | 0x5d | 0o135 | 1011101 |\n", "| 94 | 0x5e | 0o136 | 1011110 |\n", "| 95 | 0x5f | 0o137 | 1011111 |\n", "| 96 | 0x60 | 0o140 | 1100000 |\n", "| 97 | 0x61 | 0o141 | 1100001 |\n", "| 98 | 0x62 | 0o142 | 1100010 |\n", "| 99 | 0x63 | 0o143 | 1100011 |\n", "| 100 | 0x64 | 0o144 | 1100100 |\n", "| 101 | 0x65 | 0o145 | 1100101 |\n", "| 102 | 0x66 | 0o146 | 1100110 |\n", "| 103 | 0x67 | 0o147 | 1100111 |\n", "| 104 | 0x68 | 0o150 | 1101000 |\n", "| 105 | 0x69 | 0o151 | 1101001 |\n", "| 106 | 0x6a | 0o152 | 1101010 |\n", "| 107 | 0x6b | 0o153 | 1101011 |\n", "| 108 | 0x6c | 0o154 | 1101100 |\n", "| 109 | 0x6d | 0o155 | 1101101 |\n", "| 110 | 0x6e | 0o156 | 1101110 |\n", "| 111 | 0x6f | 0o157 | 1101111 |\n", "| 112 | 0x70 | 0o160 | 1110000 |\n", "| 113 | 0x71 | 0o161 | 1110001 |\n", "| 114 | 0x72 | 0o162 | 1110010 |\n", "| 115 | 0x73 | 0o163 | 1110011 |\n", "| 116 | 0x74 | 0o164 | 1110100 |\n", "| 117 | 0x75 | 0o165 | 1110101 |\n", "| 118 | 0x76 | 0o166 | 1110110 |\n", "| 119 | 0x77 | 0o167 | 1110111 |\n", "| 120 | 0x78 | 0o170 | 1111000 |\n", "| 121 | 0x79 | 0o171 | 1111001 |\n", "| 122 | 0x7a | 0o172 | 1111010 |\n", "| 123 | 0x7b | 0o173 | 1111011 |\n", "| 124 | 0x7c | 0o174 | 1111100 |\n", "| 125 | 0x7d | 0o175 | 1111101 |\n", "| 126 | 0x7e | 0o176 | 1111110 |\n", "| 127 | 0x7f | 0o177 | 1111111 |\n", "+---------+-------------+-------+---------+\n" ] } ], "source": [ "print(tabela)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }