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