Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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