Součet dvou binárních čísel – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Součet dvou binárních čísel – Pascal – Fórum – Programujte.comSoučet dvou binárních čísel – Pascal – Fórum – Programujte.com

 

Eva
~ Anonymní uživatel
18 příspěvků
30. 10. 2021   #1
-
0
-

Ahoj, potřebovala bych pomoct s jednou úlohou z programování - se sčítáním dvou čísel ve dvojkové soustavě. Něco jsem zkoušela, vím, že mám jít od konce a hlídat pravidla součtu, kdy 1 + 1 je 0 a pamatuji si 1, ale netuším, jak to zapsat do pascalu.

Byla bych ráda za každou pomoc. Děkuji.

Nahlásit jako SPAM
IP: 2a00:1028:96d2:d042:f0cc:f29d:dd84:5f8a...–
gna
~ Anonymní uživatel
1891 příspěvků
31. 10. 2021   #2
-
0
-

Co konkrétně nevíš, jak udělat?

Nahlásit jako SPAM
IP: 213.211.51.–
31. 10. 2021   #3
-
0
-

   

Uses strutils;
Begin
  WriteLn(intToBin(%1010 + %0011, 5)); // dvě binární čísla a počet číslic ve výsledku
End.
Nahlásit jako SPAM
IP: 178.22.113.–
Eva
~ Anonymní uživatel
18 příspěvků
31. 10. 2021   #4
-
0
-

Potřebovala bych program nebo proceduru/funkci provádějící součet dvou binárních čísel. Nejspíše půjdu zprava doleva pomocí for cyklu, ale poté nevím jak podmínit sčítání u 1+1, kde si musím pamatovat 1 a pak to implementovat do sčítání. Opravdu si s tím nevím rady.

Nahlásit jako SPAM
IP: 2a00:1028:96d2:d042:fc54:d18c:bab6:abf6...–
gna
~ Anonymní uživatel
1891 příspěvků
1. 11. 2021   #5
-
0
-

Tak si uděláš proměnnou, ve které budeš mít tu hodnotu, co si chceš pamatovat.

Nahlásit jako SPAM
IP: 213.211.51.–
Eva
~ Anonymní uživatel
18 příspěvků
5. 11. 2021   #6
-
0
-

Takže procedure o dvou parametrech - 1. a 2. binární číslo. Pak proměnné pro přiřazení délek řetězců. Pak projít for cyklem od posledního charakteru až k prvnímu a pak nevím jak... Přiřadit proměnné součet a když je to 1+1, tak si pamatovat 0, ale jak to přidat do dalšího součtu. Poradíte prosím?

Nahlásit jako SPAM
IP: 2a00:1028:96d2:d042:a14b:f87d:1c7a:2a4f...–
peter
~ Anonymní uživatel
4014 příspěvků
5. 11. 2021   #7
-
0
-

Kdyz nevis, kudy kam... Co jsi nasla googlem?
google = pascal binary counting
https://www.tutorialspoint.com/…perators.htm
 

obvykle
x := b + c // scitani
x := b or c // binarni scitani

v := 123;
bit0 := v and 0x01; // nebo mozna pujde v & 1
bit1 := (v>>1) & 0x01;

v & 1 udela to, ze binarne ANDuje bity v, 00001111 and 00000001 = 00000001.
Shifty delaji to, ze rotuji bity doprava nebo doleva,  00001111>>1 = 000000111
if (v & 1 == 1) jestli se posledni bit vpravo ==1
Jestli potrebujes poscitat binarne vsechny bity cisla V, pak potrebujes cislo rotovat shifty a pouzit cyklus pro 8 bitu.

Je samozrejme otazka, zda pracujes s cisly (1, 2, 3... 255) nebo stringem '000000001'. U stringu musis nejakym zpusobem vybrat posledni cislo, prevest jej na cislo a pak jej muzes jako cislo ANDovat. Nebo to zpracujes pres prevadeni, jako string.
Tezko rict, jake mas zadani...

Nahlásit jako SPAM
IP: 2001:718:2601:258:20fb:a6d:1022:30ed...–
peter
~ Anonymní uživatel
4014 příspěvků
5. 11. 2021   #8
-
0
-

Sak, zkus napsat tvuj program a pridej tm komentare, co to ma delat nebo si myslis, ze ma delat a co ti tam schazi dodelat a s cim si nevis rady. Pokud dokazes popsat, co ma ktera cast programu delat, tak ji obvykle taky dokazes napsat v kodu.
Mne hodne pomahalo promyslet si programy s papirem a tuzkou, kdyz slo o nejake slozite veci. Napsal jsem si tam, co chci mit na vystupu, tipnul nejake zaludne moznosti vstupu. A opravoval do tehdy, nez to vyhovelo vsem testovacim hodnotam. Pak presel k dalsi casti. Nebo na preskacku, odladil jednu cas pro nejake vstupni hodnoty...
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:20fb:a6d:1022:30ed...–
Eva
~ Anonymní uživatel
18 příspěvků
5. 11. 2021   #9
-
0
-

Chtěla bych to vyřešit tak, že na vstupu se zadají dva řetězce, které budou představovat dvě binární čísla. Ty řetězce budu procházet od konce. Pokud bude poslední ''znak'' (1.čísla) jedna a (2.čísla) také jedna, tak do výsledné proměnné uložím na poslední místo nulu a pamatuju si jedničku. Pak pokračuju podle pravidel, ale jde mi o to, jak to správně zapsat. 

delka:=Ord(bin1[0]); (bin1>bin2)
      for I:=5 downto 1 do begin
                                      if (bin1[delka] = 1) and (bin2[delka] = 1) then begin
                                                                                      vysledek[delka] :=0;
                                                                                      carry := 1;
                                                                                      end;

Nahlásit jako SPAM
IP: 2a00:1028:96d2:d042:8c53:a31:9c77:1fb1...–
gna
~ Anonymní uživatel
1891 příspěvků
5. 11. 2021   #10
-
+1
-
Zajímavé

No, vida, s tímhle už se dá pracovat.

Pro zjištění délky stringu mi přijde jasnější použití funkce Length, než technický detail, že na indexu 0 je délka.

Pro procházení těch stringů by se hodilo, aby měly stejnou délku, tak bych je zarovnal. A ještě bych na začátek přidal jednu 0, aby tam bylo místo pro případný poslední carry. Na tom úplně nesejde, ale přijde mi to jako takové přímočaré zjednodušení pro začátečníky.

To sčítaní samotné je pak sčítání tří hodnot (nebo dvakrát sčítání dvou hodnot). Dvě číslice z těch sčítaných stringů a carry z předchozího sčítání. To si myslím, že nemusíš vypisovat a můžeš použít matematické operace.

Takže nevím, v jakém Pascalu děláš, ale toto projde ve FreePascalu.

uses
    math, // max
    strutils, // addchar
    sysutils; // strtoint

// digit to integer
function d2i(c: char): integer;
begin
  d2i := ord(c) - ord('0');
end;

// integer to digit
function i2d(i: integer): char;
begin
  i2d := chr(ord('0') + i);
end;

var
    a, b, c: string;
    i, soucet, prenos: integer;

begin
    // vstup
    a := '111110';
    b := '1011';
    
    // priprava
    a := addchar('0', a, max(length(a), length(b)) + 1);
    b := addchar('0', b, length(a));
    c := addchar('0', '', length(a));
    prenos := 0;

    // vypocet
    for i := length(a) downto 1 do
    begin
        soucet := d2i(a[i]) + d2i(b[i]) + prenos;
        c[i] := i2d(soucet mod 2);
        prenos := soucet div 2;
    end;

    // kontrola
    writeln('  ', a, ' ', strtoint('%' + a));
    writeln('+ ', b, ' ', strtoint('%' + b));
    writeln('= ', c, ' ', strtoint('%' + c));
end.
Nahlásit jako SPAM
IP: 213.211.51.–
Eva
~ Anonymní uživatel
18 příspěvků
6. 11. 2021   #11
-
0
-

Supéér, moc Vám děkuji. Jen bych se ještě prosím chtěla zeptat, co znamenají tyto dva řádky. Proč převádím na char zbytek po součtu vyděleném dvěma?

c[i] := i2d(soucet mod 2);

prenos := soucet div 2;

Nahlásit jako SPAM
IP: 2a00:1028:96d2:d042:2c70:5685:6e85:21fa...–
gna
~ Anonymní uživatel
1891 příspěvků
7. 11. 2021   #12
-
0
-

Protože počítáš ve dvojkové soustavě. Zbytek po dělení 2 je 0 nebo 1.

Zkus si ten součet představit binárně: 

div --, ,-- mod
      | |
      V V
   0: 0 0
   1: 0 1
   2: 1 0
   3: 1 1

Jestli tomuhle nerozumíš, tak si to napiš po svém, na tom nesejde.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý