13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 100 — #138<br />

✐<br />

Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />

PR("a ^ b = ", a ^ b);<br />

PR("~a = ", ~a);<br />

PR("~b = ", ~b);<br />

// An interesting bit pattern:<br />

unsigned char c = 0x5A;<br />

PR("c in binary: ", c);<br />

a |= c;<br />

PR("a |= c; a = ", a);<br />

b &= c;<br />

PR("b &= c; b = ", b);<br />

b ^= a;<br />

PR("b ^= a; b = ", b);<br />

} ///:~<br />

Una vez más, se usa una macro de preprocesador para ahorrar líneas. Imprime<br />

la cad<strong>en</strong>a elegida, luego la repres<strong>en</strong>tación binaria de una expresión, y luego un salto<br />

de línea.<br />

En main(), las variables son unsigned. Esto es porque, <strong>en</strong> g<strong>en</strong>eral, no se desean<br />

signos cuando se trabaja con bytes. Se debe utilizar un int <strong>en</strong> lugar de un char para<br />

getval porque de otro modo la s<strong>en</strong>t<strong>en</strong>cia cin >> trataría el primer dígito como un<br />

carácter. Asignando getval a a y b, se convierte el valor a un solo byte (truncándolo).<br />

Los operadores > proporcionan un comportami<strong>en</strong>to de desplazami<strong>en</strong>to de<br />

bits, pero cuando desplazan bits que están al final del número, estos bits se pierd<strong>en</strong><br />

(comúnm<strong>en</strong>te se dice que se ca<strong>en</strong> <strong>en</strong> el mítico cubo de bits, el lugar donde acaban<br />

los bits descartados, presumiblem<strong>en</strong>te para que puedan ser utilizados...). Cuando se<br />

manipulan bits también se pued<strong>en</strong> realizar rotaciones; es decir, que los bits que sal<strong>en</strong><br />

de uno de los extremos se pued<strong>en</strong> insertar por el otro extremo, como si estuvies<strong>en</strong><br />

rotando <strong>en</strong> un bucle. Aunque la mayoría de los procesadores de ord<strong>en</strong>adores ofrec<strong>en</strong><br />

un comando de rotación a nivel máquina (se puede ver <strong>en</strong> el l<strong>en</strong>guaje <strong>en</strong>samblador<br />

de ese procesador), no hay un soporte directo para rotate <strong>en</strong> C o <strong>C++</strong>. Se supone que<br />

a los diseñadores de C les pareció justificado el hecho de prescindir de rotate (<strong>en</strong> pro,<br />

como dijeron, de un l<strong>en</strong>guaje minimalista) ya que el programador se puede construir<br />

su propio comando rotate. Por ejemplo, a continuación hay funciones para realizar<br />

rotaciones a izquierda y derecha:<br />

//: C03:Rotation.cpp {O}<br />

// Perform left and right rotations<br />

unsigned char rol(unsigned char val) {<br />

int highbit;<br />

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

highbit = 1;<br />

else<br />

highbit = 0;<br />

// Left shift (bottom bit becomes 0):<br />

val

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!