Toon posts:

binair rekenen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is er een eenvoudige manier om ||x|-|y|| uit te rekenen, waarbij je van per positie werkt?

Als x>y ->
code:
1
2
3
4
5
        1    1
100 100 100 
  1   1   1
--- - -> --- - -> --- -
  1  11  11

Maar dat gaat fout als x<y ->
code:
1
2
3
4
5
        1    1   
110 110 110
111 111 111
--- - -> --- - -> --- - ->  oops, 1tje over
  1  11 111

bestaat er dan een manier zodat je als je dat 1tje over houdt van links naar rechts door je antwoord loopt om dat aan te passen?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 16-09 21:19

Delphi32

Heading for the gates of Eden

Ik hoop dat ik niet al te stom klinkt, het is al jaren geleden dat ik binair gerekend heb...

maar als ik het goed zie, dan moet je dus een 1 verschuiven naar de fictieve 4e kolom van rechts. Dan mogen we er dus van uit gaan dat in je niet-gebruikte kolom (altijd 1 links van je reeks enen/nullen) je sign staat. Die wordt dus nu 1, oftewel een negatief getal. Geloof ik. Maar snap je wat ik bedoel?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
1000 - 111 = 001

dus bij underflow 1000 - het antwoord

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16-09 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat je hier neerzet klopt helemaal

Als je x - y doet, en x < y, dan krijg je een negatief getal, of een underflow, ligt er maar net aan of je je getallen als signed of unsigned behandelt...

Stel je hebt een totaal van 4 bits. En dan gebruik ik even je 2e voorbeeldje
code:
1
2
3
4
5
  1     1       1       1
0110      0110    0110    0110
0111 -  =>  0111 -  =>  0111 -  =>  0111 -
------  ------  ------  ------
   1        11     111    1111

met 4 bits heb je in totaal 24 = 16 mogelijkheden. Met unsigned integers is dit van 0 t/m 15 en met signed van -8 t/m 7

Stel je hebt unsigned: je doet hier 6 - 7, waar dus -1 uit zal komen... je bereik is van 0 t/m 15, dus hier zal 15 uit moeten komen, aangezien er een underflow optreedt. En dat klopt ook, want 1111 is idd 15

Als je met unsigned werkt: dan moet er -1 uit komen. En dat klopt ook, want 1111 stelt -1 voor.
code:
1
2
3
0000 t/m 0111    = 0 t/m 7
1000         = -8 (begint weer van voor af aan, want 7 is het hoogst)
1001 t/m 1111    = -7 t/m -1

Wat jij wil is het absolute antwoord, dus je moet een underflow detecteren. Een underflow treedt op als je met een eentje overhouden blijft zitten terwijl al je bits al op zijn (het laatste geval in het voorbeeld). In het geval van een underflow, zul je dus de inverse van het getal moeten bepalen (-1 wordt 1).

Dat doe je door alle bits van het antwoord om te zetten, dus een 0 wordt 1 en een 1 wordt 0, en er vervolgens 1 bij op te tellen

Dus:
code:
1
1111  =>  0000  =>  0001

En dan heb je je goede antwoord :)

.edit: pfff doe ik de moeite een lang verhaal te tiepen en dan posten ze snel voor hun beurt :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Tnx, hier kan ik mee aan de slag!