left bitwise c bit-manipulation

left - bitwise operators c++



¿Qué es CHAR_BIT? (3)

Citando el código para calcular el valor absoluto entero (abs) sin ramificar desde http://graphics.stanford.edu/~seander/bithacks.html :

int v; // we want to find the absolute value of v unsigned int r; // the result goes here int const mask = v >> sizeof(int) * CHAR_BIT - 1; r = (v + mask) ^ mask;

Variación patentada:

r = (v ^ mask) - mask;

¿Qué es CHAR_BIT y cómo se usa?


Debe tener en cuenta que este código depende del comportamiento definido por la implementación del cambio de bits a la derecha en los tipos firmados. gcc promete dar siempre el mismo comportamiento (sign-bit-extension) pero ISO C permite que la implementación llene a cero los bits superiores.

Una forma de resolver este problema:

#ifdef HAVE_SIGN_EXTENDING_BITSHIFT int const mask = v >> sizeof(int) * CHAR_BIT - 1; #else int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1); #endif

Su Makefile o config.h etc. puede definir HAVE_SIGN_EXTENDING_BITSHIFT en tiempo de compilación según su plataforma.


Intenta responder tanto a la pregunta explícita (qué es CHAR_BIT) como a la pregunta implícita (cómo funciona esto) en la pregunta original.

Un carácter en C y C ++ representa la unidad de memoria más pequeña que el programa C puede abordar *

CHAR_BIT en C y C ++ representa el número de bits en un char. Siempre debe ser al menos 8 debido a otros requisitos en el tipo de caracteres. En la práctica, en todas las computadoras modernas de uso general es exactamente 8, pero algunos sistemas históricos o especializados pueden tener valores más altos.

Java no tiene equivalente de CHAR_BIT o sizeof, no es necesario, ya que todos los tipos primitivos en Java son de tamaño fijo y la estructura interna de los objetos es opaca para el programador. Si traduce este código a Java, simplemente puede reemplazar "sizeof (int) * CHAR_BIT - 1" por el valor fijo 31.

En este código particular, se usa para calcular el número de bits en un int. Tenga en cuenta que este cálculo supone que el tipo int no contiene ningún bit de relleno.

Suponiendo que su compilador elige firmar amplíe los cambios de bit de los números con signo y suponiendo que su sistema utiliza la representación del complemento en 2 para números negativos, esto significa que "MÁSCARA" será 0 para un valor positivo o cero y -1 para un valor negativo.

Para negar un número de complemento a dos, necesitamos realizar un bit a no y luego agregar uno. Equitativamente podemos restar uno y luego negarlo a nivel de bit.

De nuevo suponiendo que la representación del complemento a dos está representada por todos, la exclusividad o con -1 es equivalente a la negación en modo bit.

Entonces, cuando v es cero, el número se deja solo, cuando v es uno, se niega.

Algo a tener en cuenta es que el desbordamiento firmado en C y C ++ es un comportamiento indefinido. Entonces, usar esta implementación de ABS en el valor más negativo conduce a un comportamiento indefinido. Esto puede solucionarse agregando moldes de tal manera que la línea final del programa se evalúa en unsigned int.

* Que generalmente es, pero no extrañamente, la misma unidad de memoria que el hardware puede tratar. Una implementación puede combinar potencialmente múltiples unidades de memoria direccionable por hardware en una unidad de memoria direccionable por programa o dividir una unidad de memoria direccionable por hardware en múltiples unidades de memoria direccionable por programa.


CHAR_BIT es la cantidad de bits en char . Actualmente, casi todas las arquitecturas usan 8 bits por byte, pero no siempre es así. Algunas máquinas antiguas solían tener bytes de 7 bits.

Se puede encontrar en <limits.h>