1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda com binário (complemento pa 1 e 2, excesso)

Discussão em 'Programação' iniciada por Nazgulled, 11 de Abril de 2008. (Respostas: 33; Visualizações: 11403)

  1. Nazgulled

    Nazgulled Power Member

    Eu sei que isto não tem muito a ver com programação, mas o pessoal que para neste fórum especifico deve ser o que melhor se enquadra para me ajudar com isto.

    Como uma imagem vale por mil palavras, vejam a seguinte:
    [​IMG]

    1) Isso é a minha resposta aos exercícios e gostava de saber se está tudo correcto ou não. Se estiver então o meu raciocínio esta correcto. Se não, podem-me explicar o que fiz mal e como se faz direito?

    2) Podem ver que o exercício #6, falta-lhe umas respostas. Não as sei responder e gostava que me dessem as respostas bem como me explicassem como chegaram a essas mesmas respostas.

    Espero que alguém me possa ajudar pois isto está a dar-me a volta a cabeça...
     
  2. magikRing

    magikRing Power Member

    Em Relacao a tua resolucao parece estar tudo bem, fiz a conversao do 1 e do 2 exercicio e os complementos/sinais e deu.me exactamente igual por isso suponho que esta tudo bem. em relacao ao 6 exercicio, dscpa la mas nao sei fazer xD
     
  3. Nazgulled

    Nazgulled Power Member

    O que me esta a dar a volta a cabeça é que nalguns documentos vejo a falarem que o complemento para 1 de um número qualquer é trocar TODOS os números. Mas na maior parte das tabelas que encontro a representar as mais comuns representações de binário (por exemplo para 4-bits), todas elas trocam todos os números com a excepção do bit do sinal (que foi o que eu fiz nos exercícios). Mas isso está-me a confundir e não estou a perceber quando devo trocar todos ou todos com excepção do bit do sinal...

    Quanto ao exercício 6, se alguém tiver ideias...
     
  4. acfryx

    acfryx Power Member

    Eu acho que o exercicio 1 e 2 estão errados porque quando fazes o complemento para um para dois afectas todos os bits incluindo o de sinal até porque se estás o fazer o complemente é suposto o bit de sinal mudar isto é passar de positivo para negativo ou vice-versa.

    Quanto ao último exercicio tmbém não te posso ajudar porque não consigo sequer perceber a pergunta...
     
  5. Nazgulled

    Nazgulled Power Member

    Esse o mal das pessoas que "acham". Tipo, não estou a criticar, não és obrigado (nem ninguém) a saber tudo direitinho mas é por isso que vim pedir ajuda, mas estava mesmo à procura de respostas de quem realmente perceba do assunto para que possa esclarecer isto.

    No entanto, já tive respostas de várias outras pessoas que me disseram que estava tudo correcto. E de certa forma até entendo mas lá está, queria alguém que realmente soubesse do que fala. Mas ha algo que tu disseste que eu penso estar mal, que é o passar de positivio para negativo. Eu não "passei" nada, não estou a converter nada, o número já é negativo (-233) e o objectivo do exercicio não é converter para 233 mas sim, representar o -233 em complemento para 1, complemento para 2 e excesso. E desta forma, representar um número negativo usando os complementos, não se troca o bit do sinal porque eu não quero converter o número para negativo/positivo (conforme o caso).

    Eu penso que é isto, mas precisava de alguém que me confirmasse a serio...
     
  6. acfryx

    acfryx Power Member

    Compreende o que tu dizes e tens razão...

    Mas quando respondi a tua pergunta respondi pensando que o objectivo fosse "negar" o número e se o objectivo for esse tens mesmo que trocar todos os bits (disto tenho a certeza). Em relação a tua verdadeira dúvida não te posso ajudar porque nunca vi um exercicio como esse e nem vejo utilidade num exercicio como esse.

    Aconselho-te a ver: http://en.wikipedia.org/wiki/Two's_complement.
     
  7. banid0

    banid0 Power Member

    Complemento para dois eu uso este método.

    Pegas no valor extendido a X bits que queres usar. Exemplo Queres converter o número -28 para complemento para dois para 8 bits.

    1- Pegas no valor em modulo e apos o pores em binario, extendes aos 8 bits:
    Ex: = 28 (10) = 0001 1100 (2)

    2-vendo da direita para a eskerda, até chegeres ao 1º 1 INCLUSIVE, não trocas, e trocas tudo o resto.
    Ex: = 28-> 0001 1100 ; -28 -> 1110 0100

    Aqui tens o -28 em binario, a 8 bits e em complemento para dois 1110 0100 ou 0xE4

    Outros livros/pessoas usam outro metodo, que e somar um ou qq coisa do genero, que é a mesma coisa que trocar todos os numeros à esquerda do 1º bit a 1.
     
  8. Baderous

    Baderous Banido

    Vamos lá ver se consigo explicar isto de uma forma...digamos...expedita! :D

    Exercício 2:
    Pretende-se representar um nº negativo (-233). Logo para representar em:
    a) Sinal+Amplitude: Convertes o valor positivo do nº (233) para binário e de seguida trocas o 1º bit para 1 (porque é negativo).
    b) Compl. p/1: Pegas no valor binário do nº positivo (233) e invertes os bits TODOS.
    c) Compl. p/2: Igual ao anterior mas somas 1 no fim.
    d) Excesso 2^(n-1): 2^(n-1) = 2^(10-1) = 2^9 = 512. 512 - 233 = 279. Convertes para binário e está feito.

    Exercício 3:
    Como o nº em binário começa por 1, deduzes que é negativo. Logo para representar em:
    a) Inteiro sem sinal: Passas o nº todo para decimal.
    b) Sinal+Amplitude: Ignoras o 1º bit e fazes as contas com o resto para passares para decimal e no fim, colocas o sinal - antes do valor que te deu como resultado.
    c) Compl. p/1: Como já sabes que o nº em binário é negativo, podes ignorar o 1º bit, depois invertes todos os restantes e fazes as contas. No fim acrescentas o sinal - ao resultado.
    d) Compl. p/2: A mesma coisa que o anterior, mas somas 1 depois de inverteres.
    e) Excesso 2^(n-1): 2^9 = 512. 512 -117 = 395. Convertes para binário.

    6)
    ii a) Em compl. p/2 a gama de valores varia entre -2^(n-1) e 2^(n-1) - 1. Logo: [-32,+31].
    ii b) [-2048,+2047]

    Esta do excesso não tenho a certeza, mas como no excesso 127, a gama de valores varia entre -126 e +127 deduzi que em excesso 2^(n-1) a gama de valores varia entre -2^(n-1) + 1 e 2^(n-1):

    iii a) [-31,+32].
    iii b) [-2047,+2048]

    Pormenores a ter em conta:
    - Em compl. p/1 e p/2, se o 1º bit é 1, então o nº é negativo, senão é positivo. (caso especial para o 0 em compl. p/1)
    - Se precisares de completar o nº com bits até ao tamanho pedido pelo enunciado tens 2 hipóteses:
    a) Se for em Sinal+Amplitude, acrescentas 0's à esquerda e o último bit que acrescentas fica 0 se for positivo ou 1 se for negativo
    b) Se for em compl. p/1 ou p/2, basta fazer a extensão do sinal (acrescentar 0's se for positivo ou 1's se for negativo).

    Pelo que vi tens tudo certo.
     
    Última edição: 12 de Abril de 2008
  9. acfryx

    acfryx Power Member

    Só agora depois da explicação dada é que percebi o objectivo do exercicio (que continuo a achar sem lógica nenhuma mas pronto) e tal como disseram tens as perguntas 2 e 3 certas (execepto a parte do excesso 2^(n-1)).

    Quanto à 6):

    -31 a 31 | 100001 a 011111
    -2047 a 2047 | 100000000001 a 011111111111

    Para a última coluna deve ser "só" converter para excesso 2^(n-1).

    Alguém sabe dizer em que é usado o excesso 2^(n-1)??
     
  10. Baderous

    Baderous Banido

    Eu acho que a parte do excesso também está certa.

    É importante para depois perceber como são representados os expoentes nos números de vírgula flutuante.

    Podias explicar?
     
  11. Nazgulled

    Nazgulled Power Member

    Mas isto é exactamente o que eu fiz com a diferença de não trocar o bit do sinal. O resultado é o mesmo. Ou seja, tu usas o valor em módulo e trocas TODOS, eu uso o próprio número negativo mas não troco o bit do sinal. Vai dar ao mesmo.

    Não, isso é diferente, o método que tu usas é o mais simples, mais directo. O metodo que ensinam sempre primeiro para passar um número para complemento para 2 é primeiro fazer-lhe o complemento para 1 e depois somar 1, isso é que é o complemento para dois. Esse método que tu falas, é só um método mais fácil de chegar ao complemento para dois.

    Basta teres dito que o que eu fiz está correcto lol. Porque ya, mais coisa menos coisa, foi isso que eu fiz. Eu só tinha confundido umas coisas que agora acho que já consegui entender.

    Não te enganaste no ii)? Não seria mais [-2048, +2027] ?

    De qualquer forma, a minha dúvida aqui é mais porque é que o resultado é este? Isto (-2^(n-1) e 2^(n-1) - 1) é alguma regrar que convém saber? Queria perceber porquê que é assim, se é que me entendes. Porque eu até já tinha chegado a este resultado porque vi noutros exemplos, mas queria perceber o porquê...

    Quanto ao exercício 6 na parte do excesso ainda parece haver discordância, fico caladinho a ver o desenlace da vossa conversa... :P
     
  12. Baderous

    Baderous Banido

    Ya, enganei-me, já tinha visto o erro e acabei por não corrigir. [-2048,+2047]

    Eu vi essa regra num pdf que tenho. Explicação há sempre, mas eu não sou grande mestre nesta área...:sad:
     
  13. acfryx

    acfryx Power Member

    Já percebi o objectivo do exercicio...

    Para 6 bits:
    1) Qual o valor maximo e minimo que se pode representar com 5 bits + sinal?
    R: Max = 2^5 - 1 = 31. Min = - (2^5 - 1) = -31

    Então em i) fica -31 a 31.

    2) Qual o valor maximo e minimo que se pode representar em complemento para um?
    R: Max = 2^5 - 1 = 31. Min = - (2^5 - 1) = -31

    Então em ii), tal como em i), fica -31 a 31.

    3) Qual o valor maximo e minimo que se pode representar em complemento para dois?
    R: Max = 2^5 - 1 = 31. Min = - 2^5 = -32.
    Explicação: se pegares em 100000b => 0111111b => 100000b = 32, ou seja 100000b é -32.

    Então em iii) fica -32 a 31.

    Para 12 bits é só fazer a analogia:
    i) -4095 a 4095
    ii) -4095 a 4095
    iii) -4096 a 4095

    Esses enunciados são um bocado manhosos...
     
  14. Baderous

    Baderous Banido

    0111111b -> puseste um 1 a mais.
    Então, tipo: 100000 = 32 e 011111 = 31, mas como é representado em compl. p/2 o 1º bit indica o sinal, logo fica [-32,+31] ?

    Não te enganaste? Acho que fizeste os cálculos com 2^12.
     
  15. Nazgulled

    Nazgulled Power Member

    Acho que vou deixar a parte da gama de valores em excesso para um prof porque já me tão a comer a cabeça toda.

    Obrigado pela ajuda, isto tinha sido em cheio ontem, mas hoje também serve :P
     
  16. acfryx

    acfryx Power Member

    Tens razão...

    A explicação e um bocado vaga, mas tenho a certeza daquilo que estou a dizer. Para justificar posso dizer que (em complemento para dois) sempre que converto um número negativo para positivo ignoro o bit de sinal.

    Se tentares fazer contas com o -32 vez que funcionam perfeitamente em complemento para 2.
    (Atenção que não funcionam em complemento para um, daí a i) ser igual à ii)).
     
  17. Neptune

    Neptune 1st Folding then Sex

    Como não tenho tempo para explicar, posso arranjar-te umas apresentações de uma cadeira em que falei disso. Diz alguma coisa se ainda precisares...
     
  18. Baderous

    Baderous Banido

    Eu sei a regra e isso chega para resolver, mas por acaso gostava de perceber como é que a coisa funciona.

    EDIT: Agora que reparei, eu obtive os mesmos resultados que tu. A única dúvida era mesmo no excesso 2^(n-1).
     
  19. Bem, eu não percebo nada disto (ou seja, não tenho nenhuma cadeira onde me tenham ensinado isto) mas depois de ler os links...

    "A representação binária para um valor x qualquer em excesso de 2^(n-1) é calculada da seguinte forma:
    x + 2^(n-1)"


    Então acho que posso tirar as seguintes conclusões:

    O menor valor que x pode tomar é -2^(n-1) ou seja, representando por 0 (x + 2^(n-1) = 0). Sabemos ainda que estamos a representar em n bits, o que faz com que x + 2^(n-1) <= 2^n - 1, correcto? (Com 8 bits representamos os números de 0 a 255, com n bits representamos de 0 a 2^n - 1). Então é trivial resolver a inequação e ver que x <= 2^n - 2^(n-1) - 1 = 2^(n-1) * (2 - 1) - 1 = 2^(n-1) - 1.


    Está demonstrado que a gama de valores 'x' representáveis por excesso de 2n-1 é:
    [-2^(n-1) , 2^(n-1) -1]

    Estarei correcto?​
     
    Última edição: 13 de Abril de 2008
  20. acfryx

    acfryx Power Member

    http://www.cs.grinnell.edu/~rebelsky/Courses/CS152/97F/Readings/student-binary.html#excess
    Só agora é que reparei que iii) fazia referencia à notação excesso 2^(n-1) e não a complemento para dois daí que na minha explição a iii) é na realidade a ii) e a ii) fica sem efeito. Desculpem lá esta minha estupides e muita falta de atenção...
     

Partilhar esta Página