{"id":1366,"date":"2022-08-11T09:43:20","date_gmt":"2022-08-11T12:43:20","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=1366"},"modified":"2022-08-11T09:45:08","modified_gmt":"2022-08-11T12:45:08","slug":"conversao-decimal-para-binario-parte1","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/conversao-decimal-para-binario-parte1\/","title":{"rendered":"Convers\u00e3o de valor decimal para bin\u00e1rio [parte 1]"},"content":{"rendered":"\n<p>Existem v\u00e1rias formas de fazer a convers\u00e3o entre a base decimal e bin\u00e1ria. Inicialmente ser\u00e1 apresentada duas formas: a primeira utiliza apenas opera\u00e7\u00f5es aritm\u00e9ticas &#8220;tradicionais&#8221;, enquanto a segunda forma utiliza opera\u00e7\u00f5es <em>bitwise<\/em>. Outras formas de convers\u00e3o entre as bases s\u00e3o mostradas em outras postagens, uma vez que utilizam outros recursos de programa\u00e7\u00e3o, como o uso de vetores e da recursividade de fun\u00e7\u00f5es (possivelmente as formas mais comuns de realizar a convers\u00e3o de decimal para bin\u00e1rio).<\/p>\n\n\n\n<p>A convers\u00e3o de um n\u00famero decimal para um n\u00famero bin\u00e1rio envolve a sucessiva divis\u00e3o da parte inteira do valor decimal por 2. A cada divis\u00e3o, o resto da divis\u00e3o \u00e9 um d\u00edgito bin\u00e1rio correspondente \u00e0 nova base. A maior dificuldade na convers\u00e3o est\u00e1 no fato de que a posi\u00e7\u00e3o no valor bin\u00e1rio desses restos da divis\u00e3o s\u00e3o inversos a sua ocorr\u00eancia na divis\u00e3o. \u00c9 importante destacar que a convers\u00e3o do valor decimal para o bin\u00e1rio que ser\u00e1 tratada no exerc\u00edcio envolve converter um valor inteiro e positivo. Valores negativos devem levar em considera\u00e7\u00e3o outra representa\u00e7\u00e3o bin\u00e1ria para o valor.<\/p>\n\n\n\n<p>O c\u00f3digo a seguir \u00e9 respons\u00e1vel pela convers\u00e3o do valor decimal para um inteiro. O valor decimal \u00e9 armazenada na vari\u00e1vel <em>dec<\/em> (o algoritmo poderia ser alterado para converter um valor informado pelo usu\u00e1rio). A solu\u00e7\u00e3o \u00e9 uma forma de obter o correspondente bin\u00e1rio, mas armazenando como um outro valor inteiro.<\/p>\n\n\n\n<p>O algoritmo considera um &#8220;peso&#8221; aplicado \u00e0 cada divis\u00e3o. O primeiro resto da divis\u00e3o \u00e9 o d\u00edgito mais a direita do valor (o menor significativo). Cada novo resto de divis\u00e3o obtido \u00e9 um d\u00edgito mais a esquerda e mais significativo para a composi\u00e7\u00e3o do valor bin\u00e1rio. O qu\u00e3o significativo \u00e9 o valor \u00e9 definido pela express\u00e3o do d\u00edgito, sendo expressa por <em>10<sup>cont<\/sup><\/em>, sendo <em>cont<\/em> a posi\u00e7\u00e3o do d\u00edgito. A tabela a seguir mostra o impacto de cada valor em rela\u00e7\u00e3o a sua posi\u00e7\u00e3o. O resultado final \u00e9 a soma de cada valor obtido no &#8220;Peso no valor total&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Valor<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Parte inteira <br>da divis\u00e3o<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Resto <br>da divis\u00e3o<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Posi\u00e7\u00e3o<\/strong><\/td><td><strong>Peso no valor total<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">21%2<\/td><td class=\"has-text-align-center\" data-align=\"center\">10<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td>1*<em>10<sup>0<\/sup> = 1<\/em><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10%2<\/td><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><em>0<\/em>*10<sup>1<\/sup> = 0<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5%2<\/td><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td>1*<em>10<sup>2<\/sup> = 100<\/em><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2%2<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><em>0<\/em>*10<sup>3<\/sup> = 0<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">1%2<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td>1*10<sup>4<\/sup> = 10000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;math.h&gt;\n\nint main() {\n\tint cont=0,dec=21, bin=0;\n\tint resto, pot;\n\twhile (dec != 0) {\n\t\tresto = dec % 2; \t\t\/\/obtem o resto da divisao\n\t\tpot   = pow(10, cont); \t\/\/calcula a relevancia do digito\n\t\tbin += resto * pot; \t\/\/calcula e acumula a contribuicao do digito no valor\n\t\tdec \/= 2;\t\t\t\t\/\/pega apenas a parte inteira da divisao\n\t\tprintf(\"%d*10^%d = %d\\n\", resto, cont, resto*pot);\n\t\tcont++; \n\t}\n\tprintf(\"%d\", bin);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>O resultado da execu\u00e7\u00e3o do c\u00f3digo \u00e9 mostrada a seguir. Observe que o resultado da linha 12 \u00e9 dispens\u00e1vel na convers\u00e3o, sendo utilizada apenas para depurar as opera\u00e7\u00f5es a cada passo da estrutura de repeti\u00e7\u00e3o (o importante \u00e9 o resultado final, apresentado na \u00faltima linha).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">1*10^0 = 1\n0*10^1 = 0\n1*10^2 = 100\n0*10^3 = 0\n1*10^4 = 10000\n10101<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Diferente da solu\u00e7\u00e3o gerada pelo c\u00f3digo anterior, o algoritmo do pr\u00f3ximo c\u00f3digo mostra o valor considerando 8 bits. Para uma quantidade <em>n<\/em> diferente de bits \u00e9 necess\u00e1rio alterar o valor da inicializa\u00e7\u00e3o do <em>for<\/em>, iniciando com o valor <em>n-1<\/em>. Ou seja, para mostrar 8 bits (<em>n = 8<\/em>), a vari\u00e1vel <em>i<\/em> do la\u00e7o <em>for<\/em> foi inicializada com <em>7 = 8-1<\/em>.<\/p>\n\n\n\n<p>Como utiliza opera\u00e7\u00f5es em bit, o c\u00f3digo n\u00e3o \u00e9 t\u00e3o simples de entender. \u00c9 preciso prestar aten\u00e7\u00e3o em cada uma das 8 itera\u00e7\u00f5es do la\u00e7o <em>for<\/em> em rela\u00e7\u00e3o ao deslocamento de bits a direita (linha 6) e avalia\u00e7\u00e3o do teste do desvio condicional (linha 7).<\/p>\n\n\n\n<p>Pegando como exemplo a primeira itera\u00e7\u00e3o, cujo valor de <em>i<\/em> \u00e9 7. Como 7 d\u00edgitos ser\u00e3o deslocados a direita, o valor 21<sub>10<\/sub> = 00010101<sub>2<\/sub> e 00010101<sub>2<\/sub> &gt;&gt; 7 = 00000000<sub>2<\/sub>. Sendo que o valor $1<sub>10<\/sub> = 00000001<sub>2<\/sub>, o operador bitwise &amp; resultar\u00e1 em 1 apenas quando o \u00faltimo bit sendo comparado for tamb\u00e9m 1. Com isso o resultado do teste na linha 7 \u00e9 falso (um teste l\u00f3gico \u00e9 falso somente quando \u00e9 resultado um n\u00famero zero. Com isso, <em>k &amp; 1 != 0<\/em> \u00e9 equivalente \u00e0 <em>k &amp; 1<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n\nint main() {\n\tint i, dec = 21;\n\tfor (i = 7; i &gt;= 0; i--) {\n\t\tint k = dec &gt;&gt; i;\n\t\tif (k &amp; 1) {\n\t\t\tprintf(\"1\");\n\t\t} else {\n\t\t\tprintf(\"0\");\n\t\t}\n\t}\n}<\/code><\/pre>\n\n\n\n<p>Embora essa seja a parte 1 da convers\u00e3o de decimal para bin\u00e1rio, eu ainda n\u00e3o finalizei a escrita  das outras partes, ent\u00e3o n\u00e3o adianta procurar =)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existem v\u00e1rias formas de fazer a convers\u00e3o entre a base decimal e bin\u00e1ria. Inicialmente ser\u00e1 apresentada duas formas: a primeira utiliza apenas opera\u00e7\u00f5es aritm\u00e9ticas &#8220;tradicionais&#8221;, enquanto a segunda forma utiliza opera\u00e7\u00f5es bitwise. Outras formas de convers\u00e3o entre as bases s\u00e3o mostradas em outras postagens, uma vez que utilizam outros recursos de programa\u00e7\u00e3o, como o uso [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1366","post","type-post","status-publish","format-standard","hentry","category-c"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=1366"}],"version-history":[{"count":4,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1366\/revisions"}],"predecessor-version":[{"id":1371,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1366\/revisions\/1371"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=1366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=1366"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=1366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}