[ Pretender @ 26.02.2004. 17:37 ] @
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


[ filmil @ 27.02.2004. 01:12 ] @
U C-u i C++-u bilo koja ne-nulta vrednost je ekvivalentna sa „true“. Samo je 0 „false“.

f
[ Pretender @ 27.02.2004. 03:25 ] @
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).

[ Milan Aksic @ 27.02.2004. 05:03 ] @
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
[ leka @ 27.02.2004. 07:20 ] @
Umesto cele ove price mozda je bilo najbolje uputiti coveka za (TOP) tekst lociran na ovoj adresi: http://www.elitesecurity.org/tema/13455 .
[ Pretender @ 27.02.2004. 14:23 ] @
Passenger, ovo je bilo jednom za svagda o bitovima, svaka cast.
Izvinjavam se sto nisam video TOP, ali ovde si objasnio perfektno.

Pozdrav