with ptr pointer functions c++ c architecture bit-manipulation bit

c++ - pointer - ptr function c



¿Dónde aprender sobre "bit"? (9)

Intenta buscar en Google ''aritmética binaria''. Aquí hay un artículo bastante bueno para comenzar.

Estoy tratando de encontrar algunos libros o recursos hablando en detalle de bits para que, por ejemplo, pueda traducir un número (como 16) en bits. Actualmente soy un estudiante de secundaria y cada vez que leo libros de programación, puedo entender casi todo, excepto la parte de los operadores bit / bitwise. Simplemente no sé cómo funciona y por qué la gente incluso inventa bit & byte :(. Por lo tanto, espero que ustedes puedan darme algunas sugerencias sobre recursos para hablar sobre cómo traducir números / caracteres en bits.

¡Gracias por responder mi pregunta y que tengas un gran día!


No es todo un libro, pero el artículo de Wikipedia sobre representaciones binarias de números entra en detalles excesivos. Y hay una buena sección sobre conversión entre bases que puede serle útil.

Hay algunos trucos astutos e ingeniosos para trabajar con bitfields y representaciones binarias de números ; desde el encabezado stb.h :

int stb_bitcount(unsigned int a) { a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits a = (a + (a >> 8)); // max 16 per 8 bits a = (a + (a >> 16)); // max 32 per 8 bits return a & 0xff; } unsigned int stb_bitreverse8(unsigned char n) { n = ((n & 0xAA) >> 1) + ((n & 0x55) << 1); n = ((n & 0xCC) >> 2) + ((n & 0x33) << 2); return (unsigned char) ((n >> 4) + (n << 4)); } unsigned int stb_bitreverse(unsigned int n) { n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); return (n >> 16) | (n << 16); }

Simplemente asombroso. :)


No hay diferencia entre ellos ya que no siento que puedan ser comparados. Un poco fue "inventado" porque las computadoras solo conocen dos estados, encendido (1) o apagado (0). Un byte es simplemente 8 bits. No conozco ningún libro dedicado exclusivamente a la discusión de un bit o byte, pero si miras libros sobre diseño lógico, fundamentos digitales o cualquier libro sobre arquitectura de hardware, encontrarás más información sobre bits y cómo se usan. . El lenguaje ensamblador también se ocupa de bits mucho más que los lenguajes de nivel superior, por lo que es posible que desee examinar eso también.


Para responder parte de tu pregunta ...

Simplemente escriba 16 to binary en el cuadro de búsqueda de Google. Si te sientes realmente valiente, puedes escribir 16 to hex para obtener tu respuesta en hexadecimal. :)


Su problema no está relacionado con la codificación ni con ningún lenguaje de programación en particular, sino más bien con las matemáticas, especialmente el álgebra y los sistemas numéricos. Luego, la siguiente etapa será la arquitectura básica del procesador x86, que puede ir a un lenguaje de programación.

Por cierto: por lo general, los libros sobre virus para x86 son muy buenos para comprender cómo funciona la CPU, pero sin entender los sistemas base-2 y base-16 no obtendrá mucho de ellos.


Sugeriría aprender a programar un z80, PIC u otro microprocesador. Entonces comprenderá de dónde vienen los bits y los bytes. Sin embargo, antes de hacerlo, es probable que desee ensuciarse con la electrónica digital. La razón por la que existen bits es porque la electrónica digital solo tiene señales con 2 valores, es decir, encendido y apagado, por lo tanto 1 y 0, o un bit.


Todo en el mundo de la Computadora solo se puede representar con una cadena ''0'' y ''1''. Ejemplo, un tipo general de int tiene 32 bits, el tipo de longitud larga tiene 64 bits, el tipo de n bits puede representar el número de 0 a 2 ^ n-1.

Además, las operaciones de bits como ''<<'', ''>>'', ''&'' o ''|'' son más rápidas que las operaciones aritméticas en la computadora, porque usan el hardware para hacer esto. Y muchos códigos se pueden optimizar de acuerdo con esto.

Transformar un int a binario, lo primero que debe saber es que cualquier número puede representarse mediante la combinación de 2 ^ 0,2 ^ 1,2 ^ 2 .... 2 ^ k: como 6 = 2 ^ 2 + 2 ^ 1 , 13 = 2 ^ 3 + 2 ^ 2 + 2 ^ 0 y así sucesivamente, luego 6 y 13 pueden escribirse 0110 y 1101. De hecho, este es un problema matemático.

Si desea saber más sobre las operaciones de bits, creo que puede buscar en google o wiki en lugar de aquí.


Uno de los mejores libros que he leído sobre matemática binaria y cambio de bit es Hacker''s Delight. Es prácticamente EL libro sobre cualquier cosa que ver con superoptimización. Recomiendo leerlo y si el material es demasiado complejo, trabaje muy despacio. Tuve que volver a escribir funciones de biblioteca estándar como strlen () para un sistema operativo de hobby antes y este libro me salvó la vida.


http://en.wikiversity.org/wiki/Bitwise_operators

http://en.wikipedia.org/wiki/Binary_numbers

Una vez que aprenda a representar los números en la base 2 (binarios o "bits"), los operadores bit a bit son lo suficientemente simples de entender.

Daré un ejemplo simple:

Deje m = 31532 = 111101100101100 yn = 12325 = 11000000100101.

Entonces el resultado de n & m (AND bit a bit - operador binario) es:

(Si n (i) y m (i) son ambos 1, entonces el resultado es 1, 0 en caso contrario)

111101100101100 011000000100101 =============== 011000000100100

el resultado de n | m (operador bit a bit OR) es:

(si n (i) y m (i) son 0, entonces el resultado es 0, 1 de lo contrario)

111101100101100 011000000100101 =============== 111101100101101

el resultado de n ^ m (bitwise eXclusive OR - operador binario) es:

(Si n (i) ym (i) son 1, PERO NO AMBOS, entonces el resultado es 1, 0 en caso contrario)

111101100101100 011000000100101 =============== 100101100001001

el resultado de ~ n (NOT bit a bit - operador unario) es:

(si n (i) = 1, el resultado es 0, 1 en caso contrario)

111101100101100 =============== 000010011010011

sea ​​k = 3, el resultado de n >> k (desplazamiento a la derecha en modo bit) es:

111101100101100 =============== 000111101100101

Simplemente se han desplazado hacia la derecha k = 3 veces. Esto efectivamente divide el número por 2 ^ k = 8. Es comúnmente utilizado como una optimización por el compilador.

por el contrario, sea k = 3, el resultado de n << k (desplazamiento a la izquierda en el bit) es

111101100101100 =============== 101100101100000

Simplemente se han desplazado hacia la izquierda k = 3 veces. Esto efectivamente multiplica el número por 2 ^ k = 8. Una cosa que hay que notar aquí es que el entero de 32 bits solo puede contener hasta 2 ^ 32-1, ha habido un desbordamiento aritmético, es decir, se han cortado los k bits más altos.

Solo tienes que verlos cuidadosamente y descubrir estos patrones.

Son importantes en la programación porque se usan comúnmente para establecer / borrar los valores de bandera.

dado que int32 tiene 32 dígitos binarios, puede contener hasta 32 tipos diferentes de indicadores booleanos (0 para falso o 1 para verdadero)

Creo que esto es todo. Ellos son bastante intuitivos.