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;
"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;
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 ---
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...