[quote="zrinka"]Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s :) ):
[/quote]
Evo, pokusat cu objasnit...
[quote]
#include <stdio.h>
#define MASK 1<<31 :)
[/quote]
Tu sam ubacio razmak izmedju MASK i 1 jer tako treba bit. Operator << shifta broj ulijevo. Gore se broj 1 shifta ulijevo za 31 mjesto. To znaci da ako napises 1 u binarnom zapisu sa 32 znamenke, tada taj broj izgleda ovako:
00000000000000000000000000000001,
a nakon shiftanja izgleda ovako:
10000000000000000000000000000000.
Primijeti da je shiftanje zapravo mnozenje broja potencijom broja 2. Ovdje mnozis 1 sa (2 na 31).
Ne znam koliko trebam ici u detalje, ali #define MASK 1 << 31 znaci da svugdje gdje se nalazi izraz MASK, to ce biti zamijenjeno sa izrazom 1 << 31. Vrlo je dobra navika to pisati #define MASK (1 << 31) jer u protivnom mozes dobiti nezeljene efekte kod nekih slucajeva, dakle uvijek koristi zagrade kod naredbe #define.
[quote]
main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i<=32; i++){
if ((MASK & cijeli_broj)==0) :)
[/quote]
Ovdje imas bitovni & operator. Taj operator od dva cijela broja daje treci i to na nacin da je i-ta binarna znamenka treceg broja jednaka 1 ako i samo ako su i-te binarne znamenke i prvog i drugog broja jednake 1. Npr 6 & 5 daje 4 zato sto je 6 u binarnom zapisu jednak 110, 5 je 101, pa je prva znamenka rezultata jednaka 1, a druga i treca su 0.
U tvom konkretnom slucaju, MASK ima samo vodecu znamenku jednaku 1 pa ce MASK & cijeli_broj biti jednak 0 ako i samo ako je najznacajniji bit varijable cijeli_broj jednak 0.
Tako da se u narednim linijama zapravo ispisuje najznacajniji bit varijable cijeli_broj.
[quote]
printf ("0");
else
printf ("1");
cijeli_broj<<=1; :)
[/quote]
U ovoj liniji se cijeli_broj shifta za jedno mjesto ulijevo. Tako ce se najznacajniji bit varijable cijeli_broj odbaciti, a iduci bit po znacajnosti ce postati najznacajniji. Buduci da se sve odvija u petlji kroz koju se prolazi 32 puta, ispisat ce se svi bitovi varijable cijeli_broj.
[quote]
if (i%8==0) printf (" ");} :)
[/quote]
Tu se pravi razmak izmedju svakih osam bitova varijable cijeli_broj. Valjda radi lakseg citanja. Dakle, kad je varijabla i djeljiva sa 8, tada se ispise jedan razmak.
[quote]
printf ("\n");} :roll: :?:[/quote]
Mislim da ce se svi sloziti da je moje objasnjenje za ispovracat se, ali ne znam bolje...
Uglavnom, taj programcic ispisuje uneseni broj u binarnom zapisu, ali tako da grupira po osam bitova unesenog broja. Program radi uz pretpostavku da ti je int 32-bitan. Probaj sama (na papiru) napravit test na 8-bitnim brojevima, cisto da se uvjeris da radi.
zrinka (napisa): | Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s ):
|
Evo, pokusat cu objasnit...
Citat: |
#include <stdio.h>
#define MASK 1<<31
|
Tu sam ubacio razmak izmedju MASK i 1 jer tako treba bit. Operator << shifta broj ulijevo. Gore se broj 1 shifta ulijevo za 31 mjesto. To znaci da ako napises 1 u binarnom zapisu sa 32 znamenke, tada taj broj izgleda ovako:
00000000000000000000000000000001,
a nakon shiftanja izgleda ovako:
10000000000000000000000000000000.
Primijeti da je shiftanje zapravo mnozenje broja potencijom broja 2. Ovdje mnozis 1 sa (2 na 31).
Ne znam koliko trebam ici u detalje, ali #define MASK 1 << 31 znaci da svugdje gdje se nalazi izraz MASK, to ce biti zamijenjeno sa izrazom 1 << 31. Vrlo je dobra navika to pisati #define MASK (1 << 31) jer u protivnom mozes dobiti nezeljene efekte kod nekih slucajeva, dakle uvijek koristi zagrade kod naredbe #define.
Citat: |
main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i⇐32; i++){
if ((MASK & cijeli_broj)==0)
|
Ovdje imas bitovni & operator. Taj operator od dva cijela broja daje treci i to na nacin da je i-ta binarna znamenka treceg broja jednaka 1 ako i samo ako su i-te binarne znamenke i prvog i drugog broja jednake 1. Npr 6 & 5 daje 4 zato sto je 6 u binarnom zapisu jednak 110, 5 je 101, pa je prva znamenka rezultata jednaka 1, a druga i treca su 0.
U tvom konkretnom slucaju, MASK ima samo vodecu znamenku jednaku 1 pa ce MASK & cijeli_broj biti jednak 0 ako i samo ako je najznacajniji bit varijable cijeli_broj jednak 0.
Tako da se u narednim linijama zapravo ispisuje najznacajniji bit varijable cijeli_broj.
Citat: |
printf ("0");
else
printf ("1");
cijeli_broj<⇐1;
|
U ovoj liniji se cijeli_broj shifta za jedno mjesto ulijevo. Tako ce se najznacajniji bit varijable cijeli_broj odbaciti, a iduci bit po znacajnosti ce postati najznacajniji. Buduci da se sve odvija u petlji kroz koju se prolazi 32 puta, ispisat ce se svi bitovi varijable cijeli_broj.
Citat: |
if (i%8==0) printf (" ");}
|
Tu se pravi razmak izmedju svakih osam bitova varijable cijeli_broj. Valjda radi lakseg citanja. Dakle, kad je varijabla i djeljiva sa 8, tada se ispise jedan razmak.
Citat: |
printf ("\n");} |
Mislim da ce se svi sloziti da je moje objasnjenje za ispovracat se, ali ne znam bolje...
Uglavnom, taj programcic ispisuje uneseni broj u binarnom zapisu, ali tako da grupira po osam bitova unesenog broja. Program radi uz pretpostavku da ti je int 32-bitan. Probaj sama (na papiru) napravit test na 8-bitnim brojevima, cisto da se uvjeris da radi.
_________________ Sin:"Tata, šta je to rekurzija?"
Otac:"Rekurzija."
|