[ Milan Aksic @ 15.07.2001. 14:45 ] @
Knjiga iz koje ucim bolje objasnjava neke stvari od ostalih knjiga ali neke vazne stvar objasnja samo jednim kratkim primerom. Kao sto je npr. slucaj sa maskama. Naime kaze ovako _bio_equiplist vraca unsigned gde je 0 Disk jedinica prisutna
1 Prisutan koprocesor
2-3 RAM u blokovima od 16K
4-5 Inicijalni video rezim
...
8-11 Broj serijskih prikljucaka
12 Prisutan adapter za video igre
13 Prisutan unutrasnji modem
14-15 Broj stampaca

Dat je primer:

#define MODEM 0x4000
void main(void)
{
unsigned online_equip;
online_equip = _bios_equiplist();
if (online_equip & MODEM)
cout << "Interni modem instaliran.n";
else
cout << "interni modem nije instaliran.n";
}

I dalje kaze da je sam postavljeni bit 13, binarno 100000000000000, sto je hexadecimalno 4000.

E sada:

1. Kakav je to tip unsigned? Do sada sam koristio unsigned int, ili float ili char ... ali samo unsigned nisam do sada koristio.
2. Ovo je tacno da je 13 hexadecimalno 4000 ali meni nije jasno, jer se bitovi broje od nule tako da bi trebalo da 13-i bit bude za broj manje, odnosno 8192=(16)2000, a ne 16384=(16)4000.
3. Da li sam ovo dobro razumeo. Operator I NAD BITOVIMA do sada isto nisam mnogo koristio pa me interesuje da li: if (online_equip & MODEM) znaci da u broju online_equip nadje 13 bit na koji pokazuje simbolicka promenljiva MODEM i da onda ispita da li je 1 TACNO ili 0 NETACNO. Da li sam ovo dobro razumeo odnosno da li je to tako?
Poz.
[ kajla @ 15.07.2001. 16:13 ] @
Citat:
passanger je napisao:
Knjiga iz koje ucim bolje objasnjava neke stvari od ostalih knjiga ali neke vazne stvar objasnja samo jednim kratkim primerom. Kao sto je npr. slucaj sa maskama. Naime kaze ovako _bio_equiplist vraca unsigned gde je 0 Disk jedinica prisutna
1 Prisutan koprocesor
2-3 RAM u blokovima od 16K
4-5 Inicijalni video rezim
...
8-11 Broj serijskih prikljucaka
12 Prisutan adapter za video igre
13 Prisutan unutrasnji modem
14-15 Broj stampaca

Dat je primer:

#define MODEM 0x4000
void main(void)
{
unsigned online_equip;
online_equip = _bios_equiplist();
if (online_equip & MODEM)
cout << "Interni modem instaliran.n";
else
cout << "interni modem nije instaliran.n";
}

I dalje kaze da je sam postavljeni bit 13, binarno 100000000000000, sto je hexadecimalno 4000.

E sada:

1. Kakav je to tip unsigned? Do sada sam koristio unsigned int, ili float ili char ... ali samo unsigned nisam do sada koristio.
2. Ovo je tacno da je 13 hexadecimalno 4000 ali meni nije jasno, jer se bitovi broje od nule tako da bi trebalo da 13-i bit bude za broj manje, odnosno 8192=(16)2000, a ne 16384=(16)4000.
3. Da li sam ovo dobro razumeo. Operator I NAD BITOVIMA do sada isto nisam mnogo koristio pa me interesuje da li: if (online_equip & MODEM) znaci da u broju online_equip nadje 13 bit na koji pokazuje simbolicka promenljiva MODEM i da onda ispita da li je 1 TACNO ili 0 NETACNO. Da li sam ovo dobro razumeo odnosno da li je to tako?
Poz.


Unsigned ti nije tip to ti je ko neki modifikator koji ti ide uz tip, i koji kazuje da nepostoji bit za znak. Nisam radio sa C++ i tim online_equip ali verovatno kad napises samo unsigned on podrazumeva unsigned int ili tako nesto.

ovo pod 2. nisam bas razumeo.
>I dalje kaze da je sam postavljeni bit 13, binarno 100000000000000, sto je >hexadecimalno 4000.
cini mi se da si napisao mnogo nula.
13 heksadecimano nije NIKAKO 4000 decimanlo vec je 13h=19
moras malo da naucis o binarnom i hex sistemima.

if (online_equip & MODEM), operator & tije je BITwise AND tablica istinosti & je:

1 1|1
------
1 0|0
------
0 1|0
------
0 0|0

kao sto vidis tacno je samo kad su oba tacna. Evo primera:

kad imas broj 13 (binarno 1101) i hoces da vidis da li je najvisi bit 0 ili jedan ti uradis ovako

13 & 0x08

ovo ce biti tacno ako je najvisi bit ukljucen odnosno netacno ako je iskljucen:

1101=13
1000=08
-------------
1000=08 sto je tacno
kao sto vidis na svaki bit se ona tablica istinosti da bi video rezultat.
Znaci odgovor na tvoje pitanje 3. je DA.

poz.
[ Vojislav Milunovic @ 15.07.2001. 16:33 ] @
unsigned je nacin na kom kompajleru saopstavas da tip podataka ne koristi kao signed (sa znakovima tj. - + ) ako u unsigned stavis -1 to ce biti najveci broj.primer :
Code:

#include<iostream.h>
int main(){
 unsigned int gg =  - 1;
 int gg1 = -1;
 cout<<gg<<endl;
 cout<<gg1<<endl;
 cout<<(long *)gg<<endl;
 cout<<(long *)gg1<<endl;
}          

i output :
Code:

4294967295
-1
0xffffffff
0xffffffff


Drugim recima unsigned sluzi da se prikazu svi pozitivni brojevi...sa signed to pada na pola jel se najvisi bit koristi da se oznaci negativan broj
[ MoHicAn @ 15.07.2001. 16:33 ] @
Samo da napomenem

u cpp-u & nije i
i se oznacava sa &&
ili sa ||

!!!

a & znaci sledece
uzima adresu promenjive ako se ona nalazi iza njega

znaci cout<<"adresa je"<<&promenjiva;
bi izbacilo mesto u memoriji de se nalazi ta promenjiva itd itd
i to se koristi kod pointera bla bla

& se takodje koristi kod referenci znaci kad deklarisete referencu na neku promenjivu ili objekat to cete uraditi ovako npr

int &referenca promenjiva

dok se kod pointera to radi

int promenjiva
int *pokazivac = &promenjiva

...
[ kajla @ 15.07.2001. 16:56 ] @
Ma amperstand se koristi i za to, ali zar ti nisi cuo za "Bitwise" operatore? Kao sto su
&,|,^
Evo primera:

main()
{
int x,y;

x=0753;/*oktalno*/
y=0722;

printf("x & y je %on",x&y);
}

program output:

x & y je 702 evo kako to da proveris (moras da prevedes ove brojeve u binarno - bit)

111101011
111010010
--------------
111000010 da bi ovaj broj pretvorio u oktalno krupisi cifre po tri znaci:

111=7
000=0
010=2

to ti je znaci 702.

poz.
[ Vojislav Milunovic @ 15.07.2001. 17:03 ] @
Da bre mohican zar nikad nisi video nesto :

flags |= MODEM_IS_ON

if ( flags & MODESM_IS_ON ){
... modem je ukljucen ne moze da se koristi bla bla
}
[ Milan Aksic @ 15.07.2001. 18:04 ] @
Citat:
predator je napisao:
unsigned je nacin na kom kompajleru saopstavas da tip podataka ne koristi kao signed (sa znakovima tj. - + ) ako u unsigned stavis -1 to ce biti najveci broj.primer :
Code:

#include<iostream.h>
int main(){
 unsigned int gg =  - 1;
 int gg1 = -1;
 cout<<gg<<endl;
 cout<<gg1<<endl;
 cout<<(long *)gg<<endl;
 cout<<(long *)gg1<<endl;
}          

i output :
Code:

4294967295
-1
0xffffffff
0xffffffff


Drugim recima unsigned sluzi da se prikazu svi pozitivni brojevi...sa signed to pada na pola jel se najvisi bit koristi da se oznaci negativan broj


Predator znam razliku izmedju signed i unsigned, nisi pogledao dobro moje pitanje. Ovde u mom programu me je zbunilo sto se koristi samo unsigned bez tipa! Inace znma raliku izmedju signed/unsigned int ili float ... Kasnije sam pogledao i negde u helpu nasao da kada se koristi samo unsigned za deklaraciju promeljive bez tipa, onda se podrazumeva da je int. Samo mi nije jasno zasto u deklaraciji ove funkcije u zaglavlju dos.h nisu lepo stavili unsigned int, nego samo unsigned iako se podrazumeva da je tip int. Anyway thanks.
[ Milan Aksic @ 15.07.2001. 18:07 ] @
Citat:
kajla je napisao:
Citat:
passanger je napisao:
Knjiga iz koje ucim bolje objasnjava neke stvari od ostalih knjiga ali neke vazne stvar objasnja samo jednim kratkim primerom. Kao sto je npr. slucaj sa maskama. Naime kaze ovako _bio_equiplist vraca unsigned gde je 0 Disk jedinica prisutna
1 Prisutan koprocesor
2-3 RAM u blokovima od 16K
4-5 Inicijalni video rezim
...
8-11 Broj serijskih prikljucaka
12 Prisutan adapter za video igre
13 Prisutan unutrasnji modem
14-15 Broj stampaca

Dat je primer:

#define MODEM 0x4000
void main(void)
{
unsigned online_equip;
online_equip = _bios_equiplist();
if (online_equip & MODEM)
cout << "Interni modem instaliran.n";
else
cout << "interni modem nije instaliran.n";
}

I dalje kaze da je sam postavljeni bit 13, binarno 100000000000000, sto je hexadecimalno 4000.

E sada:

1. Kakav je to tip unsigned? Do sada sam koristio unsigned int, ili float ili char ... ali samo unsigned nisam do sada koristio.
2. Ovo je tacno da je 13 hexadecimalno 4000 ali meni nije jasno, jer se bitovi broje od nule tako da bi trebalo da 13-i bit bude za broj manje, odnosno 8192=(16)2000, a ne 16384=(16)4000.
3. Da li sam ovo dobro razumeo. Operator I NAD BITOVIMA do sada isto nisam mnogo koristio pa me interesuje da li: if (online_equip & MODEM) znaci da u broju online_equip nadje 13 bit na koji pokazuje simbolicka promenljiva MODEM i da onda ispita da li je 1 TACNO ili 0 NETACNO. Da li sam ovo dobro razumeo odnosno da li je to tako?
Poz.


Unsigned ti nije tip to ti je ko neki modifikator koji ti ide uz tip, i koji kazuje da nepostoji bit za znak. Nisam radio sa C++ i tim online_equip ali verovatno kad napises samo unsigned on podrazumeva unsigned int ili tako nesto.

ovo pod 2. nisam bas razumeo.
>I dalje kaze da je sam postavljeni bit 13, binarno 100000000000000, sto je >hexadecimalno 4000.
cini mi se da si napisao mnogo nula.
13 heksadecimano nije NIKAKO 4000 decimanlo vec je 13h=19
moras malo da naucis o binarnom i hex sistemima.

if (online_equip & MODEM), operator & tije je BITwise AND tablica istinosti & je:

1 1|1
------
1 0|0
------
0 1|0
------
0 0|0

kao sto vidis tacno je samo kad su oba tacna. Evo primera:

kad imas broj 13 (binarno 1101) i hoces da vidis da li je najvisi bit 0 ili jedan ti uradis ovako

13 & 0x08

ovo ce biti tacno ako je najvisi bit ukljucen odnosno netacno ako je iskljucen:

1101=13
1000=08
-------------
1000=08 sto je tacno
kao sto vidis na svaki bit se ona tablica istinosti da bi video rezultat.
Znaci odgovor na tvoje pitanje 3. je DA.

poz.


Ne ne, ne moram da ucim pretvaranje i/u hexadecimalno a evo i zasto:
1. Prvo napisao sam to iz knjige kompajlirao i daje iste rezultate kao sto pise u knjizi. I meni je bilo malo cudno kada sam video da je 13 = 100000000000000. Pogresno si razumeo. Posle malog razmisljanja dosao sam do resenja. To je 13-i bit a ne broj 13, kao sto si ti razumeo. Onda znaci ide ovako:

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384
------------------------------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - bitovi, a ne brojevi.

E sada gledaj ovamo broj bita pod rednim brojem 14, odnosno 15 ako brojis i nulu je 16384.
16384 == 100000000000000. Binarni broj 100000000000000 == (16)4000. Znaci da je ipak hexadecimalno 4000! Mozes da proveris ili da pitas predatora. Trebao bi malo da poradis na bitovima.

Predator da li znas zasto su uzeli bit 15, pod rednim brojem 14-ako se broji od nule, kada u knjizi pise da je uzet 13 bit. Po njihovoj logici taj bit bi trebao da bude 8192 ili ako se ne broji nula 4096 a ne 16384.

P.S. Ako ona gore tablica bitova nije tacno poravnjena to je zbog formatiranja.

[Ovu poruku je menjao passanger dana 07-15-2001 u 06:08 PM GMT]
[ Milan Aksic @ 15.07.2001. 18:09 ] @
E da predator jos nesto, nisi mi rekao da li sam ovu liniju koda dobro razumeo:
if (online_equip & MODEM)
Da li to znaci da u dobijenom broju nadje 13-i bit na koji pokazuje MODEM, koji je inace deklarisan sa 0x4000. I da onda kada MODEM nadje 13-ti bit u online_equip pogleda da li je taj bit 1 tacno ili 0 netacno. Ovo te uporno pitam da mi objasnis jer mi se cini da sam u nekom od tvojih postova video da OK bratas maskama.
[ Vojislav Milunovic @ 15.07.2001. 20:34 ] @
U principu se uvek koriste | i & u bit operacijama.Sa | se postavljaju bitovi a sa & se proverava.
Recimo da je 13 bit setovan i sa & na 13 bit ti treba da dobijes tacno jel to je logika & .
Znaci imas

0001 0000 0000 0000 i to uradis & sa
0001 0000 0000 0000 i dobijes
----------------
0001 0000 0000 0000

sto je tacno i znaci da je modem instaliran.E sad meni nije jasno kako 0x4000 predstavlja 13 bit ali nema veze jel 0x4000 bi trebalo da bude:
0100 0000 0000 0000 sto nikako nije 13 bit vec je to ako se nevaram 15 bit ? a 13 bit je 0x1000...
E da nikad se kod & i | ne koriste brojevi koji se sastoje iz vise bitova...recimo 3 se ne koristi jel moze da izazive nepredvidive greske...uvek se koriste brojevi sa 1 bitom aktivnim znaci:

1,2,4,8,16,32,64,128,256,512,1024, i tako do kraja jednog long sto je jednako 2147483648 ili 0x80000000 mada ja u principu nisam vide vise od 128 ;o)
[ Milan Aksic @ 15.07.2001. 21:33 ] @
Citat:
predator je napisao:
U principu se uvek koriste | i & u bit operacijama.Sa | se postavljaju bitovi a sa & se proverava.
Recimo da je 13 bit setovan i sa & na 13 bit ti treba da dobijes tacno jel to je logika & .
Znaci imas

0001 0000 0000 0000 i to uradis & sa
0001 0000 0000 0000 i dobijes
----------------
0001 0000 0000 0000

sto je tacno i znaci da je modem instaliran.E sad meni nije jasno kako 0x4000 predstavlja 13 bit ali nema veze jel 0x4000 bi trebalo da bude:
0100 0000 0000 0000 sto nikako nije 13 bit vec je to ako se nevaram 15 bit ? a 13 bit je 0x1000...
E da nikad se kod & i | ne koriste brojevi koji se sastoje iz vise bitova...recimo 3 se ne koristi jel moze da izazive nepredvidive greske...uvek se koriste brojevi sa 1 bitom aktivnim znaci:

1,2,4,8,16,32,64,128,256,512,1024, i tako do kraja jednog long sto je jednako 2147483648 ili 0x80000000 mada ja u principu nisam vide vise od 128 ;o)


Znaci ovo bi bilo u ovom primeru ovako umesto (online_equip & MODEM) bilo bi (100000000000000 & 100000000000000) jel tako. E sada sta bi funkcija vratila promenljivoj online_equip, na 13-om bitu ako modem ne bi bio instaliran ? Da li bi vratio 0 umesto 100000000000000 ?
E da i samo ako mozes da mi objasnis kako se sa | postavljaju bitovi i koja je tu neka prostija primena.
Pozdrav.
[ Vojislav Milunovic @ 15.07.2001. 22:47 ] @
Pa kod open se recimo koristi | (or) da se postave razne maske kod otvaranja file-a.Recimo

open("/root/gg",O_CREAT|O_TRUNC|O_WRONLY,0600);
mmap(0,100,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);

kod chmod() mozes da koristis razne maske za privilegije,ustvari dozvole su klasican primer | i & ;o)
one glase:
1 - x
2 - w
4 - r

;o) Ja sam se uvek pitao ranije : zasto nije 1-2-3 nego 1-2-4 ,ali to sam shvatio igrajuci se sa maskama ;o)
[ Vojislav Milunovic @ 15.07.2001. 22:48 ] @
Pa da vratilo bi 0 na 13. bitu ako modem nije setovan tj. instaliran.
[ kajla @ 16.07.2001. 01:14 ] @
Citat:
passanger je napisao:
Ne ne, ne moram da ucim pretvaranje i/u hexadecimalno a evo i zasto:
1. Prvo napisao sam to iz knjige kompajlirao i daje iste rezultate kao sto pise u knjizi. I meni je bilo malo cudno kada sam video da je 13 = 100000000000000. Pogresno si razumeo. Posle malog razmisljanja dosao sam do resenja. To je 13-i bit a ne broj 13, kao sto si ti razumeo. Onda znaci ide ovako:

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384
------------------------------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - bitovi, a ne brojevi.

E sada gledaj ovamo broj bita pod rednim brojem 14, odnosno 15 ako brojis i nulu je 16384.
16384 == 100000000000000. Binarni broj 100000000000000 == (16)4000. Znaci da je ipak hexadecimalno 4000! Mozes da proveris ili da pitas predatora. Trebao bi malo da poradis na bitovima.

Predator da li znas zasto su uzeli bit 15, pod rednim brojem 14-ako se broji od nule, kada u knjizi pise da je uzet 13 bit. Po njihovoj logici taj bit bi trebao da bude 8192 ili ako se ne broji nula 4096 a ne 16384.

P.S. Ako ona gore tablica bitova nije tacno poravnjena to je zbog formatiranja.

[Ovu poruku je menjao passanger dana 07-15-2001 u 06:08 PM GMT]

1. Nisam ja pogresno razumeo nego si ti pogresno napisao, kad napises 13 to znaci 13 decimalno, inace bit 13 nije broj, vec maska za bit 13 je broj. Moras razumeti razliku izmedju toga.

>Znaci da je ipak hexadecimalno 4000! Mozes da proveris ili da pitas >predatora.
nema ja sta da pitam predatora, jer znam da 13 decimalno nije 4000 heksadecimalno.(ako si mislio na masku za bit 13 morao si to da napises)
>Trebao bi malo da poradis na bitovima.
hm, ovo je malo bezobrazno...

[ Milan Aksic @ 16.07.2001. 01:20 ] @
Da, da sada si me podsetio na maske pod linuxom i ja sam se pitao zasto je 1-2-4 umesto npr. 1-2-3, a ono zbog sabiranja privilegija. Interesantno. Ipak odustao sam, nadam se privremeno od ucenja rada na Linuxu.
[ kajla @ 16.07.2001. 01:21 ] @
Citat:
predator je napisao:
U principu se uvek koriste | i & u bit operacijama.Sa | se postavljaju bitovi a sa & se proverava.

Hm...koristi se i ^ za invertovanje nekog bita. Recimo ja sam taj operator koristio za invertovanje bitova pokupljenih sa paralelnog porta (posto su neki pinovi "hardware inverted") na primer:

1011
0101
------
1110

kao sto vidis invertovao sam bit 2 i 0.

Jos sa & moze da se iskljuci bit, dok sa | ukljucis.

poz.
[ Vojislav Milunovic @ 16.07.2001. 10:38 ] @
Pa ono ^ je xor imas i ~ gde se svi bitovi okrenu ,od 1 dobijes -2 itd...kako radi ne znam tacno,ali radi

Code:

int main(){
 int gg = 1;
 gg = ~gg;
 printf("%dn",gg);
}


ovo ~ i & se dosta koriste da se nadje recimo pocetak segmenta za upotrebu sa mprotect()
[ kajla @ 16.07.2001. 12:08 ] @
Pa da operator ~ radi bas tako, evo napravio sam funkciju printb() koja
stampa broj binarno gde se lepo vidi sa su svi bitovi invertovani:

[code]#include <math.h>

int main()
{
int gg = 1;

printb(gg);
gg = ~gg;
printb(gg);
printf("%dn%un",gg,gg);
}

printb(int i)
{
short sub;

for (sub=15;sub>=0;sub--)
if (i & (int)pow(2,sub) )
putchar('1');
else
putchar('0');
puts("");
return 0;
}[code]
Program output:

0000000000000001
1111111111111110
-2
4294967294

poz.



[[b]Ovu poruku je menjao kajla dana 07-16-2001 u 01:07 PM GMT[/b]]