Miten tämä yksinkertainen functio toimii!

kysyisin että kuinka tämä functio toimii, siis tiedän että mitä mutta lähinnä miten kun yritän sitä itse paperilla käydä läpi mutta en koskaan saa 'Result' arvoksi 0:llaa,

"functio on lainattu internetistä googlen avulla"

Functio:

function IntToBin(Value: LongInt; Digits: Integer): String;
var
i: Integer;
begin
Result:='';
for i:=Digits downto 0 do
if Value and (1 shl i)0 then
Result:=Result '1'
else
Result:=Result '0';
end;
3344
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

Se muuttaa yksinkertaisesti luvun merkki jonoksi joka sisältää kyseisen luvun binaarisen esitys muodon.

Sinänsähän kyseisen koodin pitäisi olla ihan selkeä. Sulkeiden käyttö toisaalta olisi ehkä suotavaa tuossa IF lauseessa. Muokkasin tuon koodin niin että siinä on sulkeet ja laitoin sen tulostamaan joka kierroksen tiedot ruudulle. Alla on esimerkki koodi ja tulostus siitä miten funktio toimii kun sitä kutsutaan seuraavasti: IntToBin(10, 8). Ideahan funktiossa on se että joka kierroksella katsotaan onko tietty bitti päällä Value muuttujassa vai ei. Jos bitti on päällä niin tällöin Result merkkijonon perään lisätään merkki '1' ja jos bitti ei ole päällä niin tällöin Result merkkijonon perään lisätään merkki '0'. Digits arvo kertoo kuinka monta bitti luvussa on, tai pikemminkin kuinka monta otetaan mukaan muunnokseen. Silmukka muuttuja i kertoo sen bitti numeron mitä ollaan tutkimassa. Lause "(1 shl i)" tarkoittaa puolestaan sitä että luvun 1 bittejä siirretään i:n verran vasemmalle, jolloin saadaan luku jossa on vain bitti numero i päällä. Kun tämä luku ("1 shl i") ja Value:n välillä suoritetaan binäärinen AND operaatio, niin saadaan vastaukseksi luku 0 jos Value:n kyseinen bitti (eli bitti numero i) ei ole päällä ja luku "1 shl i" jos kyseinen bitti on päällä. Resultiksi tulee on aina 0 kun Value on nolla. Kun Value on 0 niin Result sisältää tällöin Digitin:n verran nollia. Kun funktiota kutsutaan seuraavasti: IntToBin(0, 8), niin tällöin saadaan tulos '00000000'. Sinänsä ratkaisun ymmärtäminen voi olla hankalaa jos ei ole ennen ajatellut lukuja binaari muotoisena tai tiedä mitä binäärinen AND käytännössä tarkoittaa. Tuossa alla on pieni esimerkki mitä 6 AND 5 on, eli se on 4, (vastauksessa on aina silloin ykkönen kun kummassakin luvussa on myös kyseinen bitti ykkönen). Toivottavasti sait edes jotain selvää. :-)

0110 (5)
0101 (5) AND
=
0100 (4)




--- KOODI ALKAA ---

program Esimerkki;

function IntToBin(Value : LongInt; Digits : Integer) : String;
var
   i : Integer;
begin
   Result := '';
   for i := Digits downto 0 do begin
      if ((Value and (1 shl i)) 0) then begin
         Result:=Result '1';
      end else begin
         Result:=Result '0';
      end;

      Write(Value, ' AND ', (1 shl i), ' = ');
      Write((Value and (1 shl i)), ' (');
      Write(((Value and (1 shl i)) 0), ')');
      WriteLn(' Result = ', Result);
   end;
end;

begin
   writeln(IntToBin(10, 8));
end.


--- KOODI LOPPUU ---


--- TULOSTUS ALKAA ---


10 AND 256 = 0 (FALSE) Result = 0
10 AND 128 = 0 (FALSE) Result = 00
10 AND 64 = 0 (FALSE) Result = 000
10 AND 32 = 0 (FALSE) Result = 0000
10 AND 16 = 0 (FALSE) Result = 00000
10 AND 8 = 8 (TRUE) Result = 000001
10 AND 4 = 0 (FALSE) Result = 0000010
10 AND 2 = 2 (TRUE) Result = 00000101
10 AND 1 = 0 (FALSE) Result = 000001010
000001010


--- TULOSTUS LOPPU ---

Äänestä
  • Korjataan vielä sen verran että tarkoitin Digits muuttujaa vaikka puhuin Digitistä, ja muunnokseen otettaan mukaan "Digits 1" bittiä eikä "Digits" bittiä. Lisäki korjaus tuohon AND esimerkkin talukkoon:

    0110 (6)
    0101 (5) AND
    =
    0100 (4)


    Otetaan vielä nuo esimerkki tulostuksen arvot:

    000001010 (10)
    100000000 (256) AND
    =
    000000000 (0)


    000001010 (10)
    010000000 (128) AND
    =
    000000000 (0)


    000001010 (10)
    001000000 (64) AND
    =
    000000000 (0)


    000001010 (10)
    000100000 (32) AND
    =
    000000000 (0)


    000001010 (10)
    000010000 (16) AND
    =
    000000000 (0)


    000001010 (10)
    000001000 (8) AND
    =
    000001000 (8)


    000001010 (10)
    000000100 (4) AND
    =
    000000000 (0)


    000001010 (10)
    000000010 (2) AND
    =
    000000010 (2)


    000001010 (10)
    000000001 (1) AND
    =
    000000000 (0)

    Äänestä

  • korjauksia sanomisiin. kirjoitti:

    Korjataan vielä sen verran että tarkoitin Digits muuttujaa vaikka puhuin Digitistä, ja muunnokseen otettaan mukaan "Digits 1" bittiä eikä "Digits" bittiä. Lisäki korjaus tuohon AND esimerkkin talukkoon:

    0110 (6)
    0101 (5) AND
    =
    0100 (4)


    Otetaan vielä nuo esimerkki tulostuksen arvot:

    000001010 (10)
    100000000 (256) AND
    =
    000000000 (0)


    000001010 (10)
    010000000 (128) AND
    =
    000000000 (0)


    000001010 (10)
    001000000 (64) AND
    =
    000000000 (0)


    000001010 (10)
    000100000 (32) AND
    =
    000000000 (0)


    000001010 (10)
    000010000 (16) AND
    =
    000000000 (0)


    000001010 (10)
    000001000 (8) AND
    =
    000001000 (8)


    000001010 (10)
    000000100 (4) AND
    =
    000000000 (0)


    000001010 (10)
    000000010 (2) AND
    =
    000000010 (2)


    000001010 (10)
    000000001 (1) AND
    =
    000000000 (0)

    Tosiaan nyt ymmärrän tuon, auttaa minua monessa asiassa, erittäin selkeästi kerrottu kiitän avusta ja ajastasi...

    Äänestä

Kommentoi aloitusta


Jomppe kirjoitti:

kysyisin että kuinka tämä functio toimii, siis tiedän että mitä mutta lähinnä miten kun yritän sitä itse paperilla käydä läpi mutta en koskaan saa 'Result' arvoksi 0:llaa,

"functio on lainattu internetistä googlen avulla"

Functio:

function IntToBin(Value: LongInt; Digits: Integer): String;
var
i: Integer;
begin
Result:='';
for i:=Digits downto 0 do
if Value and (1 shl i)0 then
Result:=Result '1'
else
Result:=Result '0';
end;

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu