significa que prioridad precedencia operadores jerarquia asignacion c udp hex packet bit

que - Programación C: operadores en modo bit y saber cuándo utilizar



precedencia de operadores en c (3)

¿Cuándo sabe cuándo usar los operadores bit a bit para alcanzar un cierto valor?

Use operadores bit a bit cuando necesite operar en bits individuales de un objeto, y la aritmética simple simple no sea suficiente o describa menos claramente la intención del código.

Sé que esto suena fácil, pero realmente tan simple como eso.

¿Por qué hay un hexadecimal &0xffff allí al lado de la sum

& es el operador bit a bit. En este caso, se usa para lograr una máscara de bits .

¿Qué significa ~sum ?

~ es la operación inversa de bit a bit; invierte el valor de cada bit.

Espero que cada uno de estos operadores se explique en cualquier libro que estés usando para aprender C.

He leído en el libro de K & R II C Programación ANSI C que los operadores ">>" y "<<" controlan bits y, por supuesto, siendo un novato conmigo, no entiendo cuándo usarlos. Me interesó averiguar cómo crear paquetes manualmente y me encontré con el siguiente fragmento:

unsigned short csum(unsigned short *buf, int nwords) { unsigned long sum; for(sum=0; nwords>0; nwords--) sum += *buf++; sum = (sum >> 16) + (sum &0xffff); sum += (sum >> 16); return (unsigned short)(~sum); }

Sé que esto calcula la suma de comprobación, pero no entiendo qué está sucediendo aquí. XD

Obviamente esto está fuera de mi rango de habilidades, pero pensé que puedo usar este fragmento como chivo expiatorio para resolver algunas preguntas sin respuesta. ¿Cuándo sabe cuándo usar los operadores bit a bit para alcanzar un cierto valor, por qué no simplemente agregar (+) o restar (-)? Además, ¿por qué hay un hexadecimal &0xffff allí junto a la sum , si no hay operadores con los dos?

PD: ¿Qué significa ~sum ?


Todo lo que estás hablando tiene que ver con las operaciones en el nivel de bits. Por ejemplo, "var >> num" desplaza la var a la derecha por num (lo que significa que divide la var por 2 ^ num). También el ~ var invierte la var en el nivel de bit (por ejemplo, si var = 5 en notación de bit = 101 ----> ~ var = 010)


Esa no es una pregunta, eso es un montón. :)

  1. Utiliza operadores bit a bit cuando quiere ver un número como una colección de bits, en lugar de un número entero. Es mucho más fácil decir "Quiero que este patrón de bits se desplace dos bits hacia la izquierda" que crear la operación matemáticamente equivalente. Son conceptualmente diferentes; si piensas en el número como bits, usar un operador de bits tiene más sentido.
  2. El & 0xffff se asegura de que el valor sea de 16 bits, al enmascarar todos los bits más altos. Esto supone que el unsigned long del sistema tiene al menos 16 bits de ancho, lo cual es una suposición bastante segura. El & ( AND bit) a menudo se usa para este propósito. Mire la tabla de verdad para la conjunción lógica y piense "falso es 0, verdadero es 1" para ver cómo funciona esto.
  3. La constante & antes de la hexadecimal es el operador AND bit a bit de C, que se usa para hacer la máscara que describo arriba. Básicamente, para las variables de a & b bit a & b , el resultado es 1 si y solo si tanto a como b son 1. El operador aplica esta lógica a cada par de bits en sus términos de entrada.
  4. El operador ~ es la inversión bit a bit de C, "voltea" los bits de su argumento. Se usa comúnmente para crear máscaras.