Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

operatori pomeranja

[es] :: C/C++ programiranje :: operatori pomeranja

[ Pregleda: 1657 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon operatori pomeranja26.02.2004. u 17:37 - pre 245 meseci
Pozdrav svima.

Posle duzeg odsustvovanja zbog bavljenja drugim stvarima (by force of circumstances), evo me opet na ESu.
Nabavio sam (po brojnim preporukama) knjigu 'Thinking in C++' od B.Eckela, koja je izasla nedavno.
Eckel ima potpuno drugaciji(klasicniji) pristup od Liberty-ja, ali sad vidim da obe
knjige imaju svoje prednosti i nedostatke.
Liberty vas odmah baca u vatru, dok Eckel polazi od temelja (dajuci prednost textu nad kodom). Mislim da bi za pocetnika bilo korisno da procita obe knjige (i pored svih, opstepoznatih zamerki na 'C++ za 21 dan'), ali nisam siguran kojim redosledom.
Moram da primetim i jedan, po meni, nekorektan potez B.Eckela, koji za resenja zadataka trazi small fee, koji iznosi 50% cene knjige. To nije ogromna suma (12$), ali obzirom na vaznost vezbi u ovakvim knjigama ovaj postupak malo smrdi. Sasvim bi OK bilo da knjiga kosta 50%(ili koliko god) vise, i da kupac zna na cemu je. Zamislite da vam prodaju novi automobil i onda pri izlasku iz salona kazu da kocioni sistem mozete (ako zelite), uz small fee, nabaviti u njihovom servisu. I ako neko ima savet; trazio sam, nije da nisam. Small fee or nothing.

Ali da predjem na stvar.
Molio bih za pomoc po sledecem pitanju:

"Rezultat operatora za pomeranje ulevo (<<) jeste vrednost operanda s leve strane
operatora, pomerena ulevo za broj bitova definisan s desne strane operatora."

Ali sta onda predstavlja (1<<i)? ("daje jedinicu u svakoj od uzastopnih pozicija bitova, binarno: 00000001, 00000010, itd")

Npr:
void printBinary(const unsigned char val) {
for(int i = 7; i >= 0; i--)
if(val & (1 << i))
std::cout << "1";
else
std::cout << "0";

"Ova f-ja ispisuje jedan bajt, bit po bit" (??)
Operator & vrsi logicku konjunkciju odgovarajucih bitova 2 bajta koja uporedjuje(npr c=a&b).
Ali u ovom slucaju da bi rez. tog operatora dao 1 ili 0 operandi moraju biti bitovi a ne bajtovi.
Vot iz dis 'baut ?

Hvala


 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: operatori pomeranja27.02.2004. u 01:12 - pre 245 meseci
U C-u i C++-u bilo koja ne-nulta vrednost je ekvivalentna sa „true“. Samo je 0 „false“.

f
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
194.106.165.*



Profil

icon Re: operatori pomeranja27.02.2004. u 03:25 - pre 245 meseci
Da stvarno, sad mi je ova f-ja jasna (ako sam dobro razumeo (1 << i)).

Ali, jos nesto:

//: C03:Rotation.cpp {O}
// Perform left and right rotations
unsigned char rol(unsigned char val) {
int highbit;
if(val & 0x80) // 0x80 is the high bit only
highbit = 1;
else
highbit = 0;
// Left shift (bottom bit becomes 0):
val <<= 1;
// Rotate the high bit onto the bottom:
val |= highbit;
return val;

Ne vidim kako rezultat disjunkcije nad bitovima dva bajta:
yxxxxxxx i 00000001(ili 00000000) moze dati xxxxxxxy (val = val | highbit).

 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
195.252.80.*



Profil

icon Re: operatori pomeranja27.02.2004. u 05:03 - pre 245 meseci
Operacija pomeranja "shift-ovanje") 1 bita u levo, identicna je aritmetickom mnozenju sa 2 (var*2^n, gde je n broj mesta pomeranja pocevsi od 0):
Code:

#include <stdio.h>
int main() {
        printf("%d\n%d\n%d\n", 1<<1, 1<<2, 1<<3);
        return 0;
}

Sto se tice ispisivanja bitova, u if uslovu se proverava dali je odredjeni bit u promenljivoj "val", postavljen ili ne. Ako je postavljen, "cout" ispisuje "1", u suprotnom ispisuje "0".
Najmanja jedinica memorije (velicina) za koju racunar "zna" je bajt, tako da ne postoji tip promenljive kojim bi deklarisao promenljivu od jednog bita (postoje "bit polja", ali tzv. "alignment-om" se to opet svodi na pomenuto). Medjutim, to ne znacida ne mozes da pristupis informacijama o bitovima.
Na primer, kada funkciji, koju si naveo u svom prvom pitanju, prosledis broj 5 (binarno 101), u prvoj iteraciji for petlje, proverava se vrednost:
Code:

// val == 5, i == 7
if(5 & (1 << 7))
// if (5 & (1 * 2 ^ 7)) ili if (5 & 128) ili if (00000101 & 10000000)
//
// nule ispred 101, ne menjaju vrednost samog broja
//  00000101 & (logicko I)
//  10000000
//  --------
//  00000000
//  0
// if (0)
// prelazi se na [b]else[/b] stavku, gde se ispisuje '0'
else
   std::cout << "0";

u drugoj iteraciji se proverava:
Code:

// if (00000101 & 01000000)
// opet se ispisuje nula

...
u sestoj:
Code:

// if (00000101 & 00000100)
// if (1)
// sada je 1 (tacno) i ispisuje se '1'

itd.

Sto se tice druge funkcije, verovatno je autor hteo da pokaze kako u C++-u odraditi assemblersku instrukciju ROL-Rotate Left (Thinking in C++?) gde se pomeranjem bitova u levo ne odbacuje krajnji levi bit (tzv. "highiest bit" ili "most significant bit" jer najvise utice na vrednost broja), ako je isti postavljen (tj. 1), vec se vraca (rotira) na mesto krajnjeg desnog bita (tzv. "lowest bit" ili opet "least significant bit").
U sledecoj liniji se proverava dali je krajnji levi bit 1
Code:

if(val & 0x80) // 0x80 is the high bit only

heksadecimalni broj 0x80 je binarno, upravo kranji levi bit 10000000 (128==1<<2^7). U zavisnosti od toga dali je isti u promenljivoj "val" postavljen ili ne, dodeljuje se 1 odnosno 0, promenljivoj "highbit", a onda se u liniji
Code:

val |= highbit;
// val == 4
// 100 |= 1
//
//  00000100 | (logicko ILI)
//  00000001
//  ------------
//  00000101 (5)

logickom operacijom ILI, krajnji desni bit postavlja na vrednost promeljive "highbit".

Za ostale logicke operacije nad bitovima pogledaj http://www.elitesecurity.org/tema/13455
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: operatori pomeranja27.02.2004. u 07:20 - pre 245 meseci
Umesto cele ove price mozda je bilo najbolje uputiti coveka za (TOP) tekst lociran na ovoj adresi: http://www.elitesecurity.org/tema/13455 .
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: operatori pomeranja27.02.2004. u 14:23 - pre 245 meseci
Passenger, ovo je bilo jednom za svagda o bitovima, svaka cast.
Izvinjavam se sto nisam video TOP, ali ovde si objasnio perfektno.

Pozdrav
 
Odgovor na temu

[es] :: C/C++ programiranje :: operatori pomeranja

[ Pregleda: 1657 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.