yoast variable soporta snippet sitename sep segundo por plugin page optimizar lentas description cuantas consultas c bit-manipulation 32bit-64bit

c - soporta - yoast seo snippet variables



¿Qué tiene de malo cambiar una variable de 32 bits de 32 bits? (5)

Recientemente recogí una copia de Applied Cryptography de Bruce Schneier y ha sido una buena lectura. Ahora comprendo cómo funcionan varios algoritmos descritos en el libro, y me gustaría comenzar a implementar algunos de ellos en C.

Una cosa que muchos de los algoritmos tienen en común es dividir una clave de X-bit, en varias claves de Y-Bit más pequeñas. Por ejemplo, la clave de Blowfish, X, es de 64 bits, pero se le exige que la divida en dos mitades de 32 bits; Xl y Xr.

Aquí es donde me estoy quedando atascado. Soy bastante decente con C, pero no soy el más fuerte cuando se trata de operadores bit a bit y similares.

Después de alguna ayuda en IRC, logré crear estas dos macros:

#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; } #define combine(a, b, c) {a = (c << 32) | a;}

Donde a es de 64 bits y byc son de 32 bits. Sin embargo, el compilador me advierte sobre el hecho de que estoy cambiando una variable de 32 bits por 32 bits.

Mis preguntas son estas:

  • ¿Qué tiene de malo cambiar una variable de 32 bits de 32 bits? Supongo que no está definido, pero estas macros parecen estar funcionando.
  • Además, ¿me sugerirías que lo haga de otra manera?

Como dije, estoy bastante familiarizado con C, pero los operadores de bit a bit y similares todavía me causan dolor de cabeza.

EDITAR

Me di cuenta de que mi macro combinada no estaba combinando realmente dos variables de 32 bits, sino que simplemente hacía OR por 0 y obtenía como resultado.
Así que, además de mis preguntas anteriores, todavía no tengo un método para combinar las dos variables de 32 bits para obtener una de 64 bits; Se agradecería una sugerencia sobre cómo hacerlo.


¿Qué tiene de malo cambiar una variable de 32 bits de 32 bits?

Además de lo que ya se ha dicho, el bit 32 es el bit de signo, y puede obtener la extensión de signo para preservar la cantada, perdiendo así bits significativos.


¿Qué tiene de malo cambiar una variable de 32 bits de 32 bits?

Es mejor asignar un entero de 0 a n bits que desplazarlo por n bits.

Ejemplo:

0 0 1 0 1 ----- 5 bit Integer 0 1 0 1 0 ----- 1st shift 1 0 1 0 0 ----- 2nd shift 0 1 0 0 0 ----- 3rd shift 1 0 0 0 0 ----- 4th shift 0 0 0 0 0 ----- 5th shift (all the bits are shifted!)

Todavía no tengo un método para combinar las dos variables de 32 bits para obtener una de 64 bits

Considere: a es de 64 bits, b y c 32 bits

a = b; a = a << 32; //Note: a is 64 bit a = a | c;


A menos que se trate de un proyecto "reinventar la rueda para comprender cómo funciona", no implemente sus propias funciones de cifrado.

Siempre.

Es lo suficientemente difícil usar los algoritmos disponibles para trabajar (y elegir el correcto), no te dispares a ti mismo al poner en producción alguna API de cryptor cultivada en casa. Es probable que su cifrado no se encripte


Cambiar un valor de 32 bits por 32 bits o más no está definido en C y C ++. Una de las razones por las que se dejó sin definir es que en algunas plataformas de hardware, la instrucción de cambio de 32 bits solo tiene en cuenta los 5 bits más bajos del recuento de turnos proporcionado. Esto significa que cualquiera que sea el número de turnos que pase, se interpretará como módulo 32. El intento de cambiar a 32 en dicha plataforma realmente cambiará a 0, es decir, no se desplazará en absoluto.

Los autores de idiomas no querían cargar a los compiladores escritos para dicha plataforma con la tarea de analizar el conteo de turnos antes de hacer el turno. En cambio, la especificación del lenguaje dice que el comportamiento no está definido. Esto significa que si desea obtener un valor de 0 de un cambio de 32 bits por 32 (o más), depende de usted reconocer la situación y procesarla en consecuencia.


Sí, es un comportamiento indefinido.

ISO / IEC 9899: 1999 6.5.7 Operadores de cambio a nivel de bit ¶3

Las promociones enteras se realizan en cada uno de los operandos. El tipo de resultado es el del operando izquierdo promovido. Si el valor del operando derecho es negativo o es mayor o igual que el ancho del operando izquierdo promovido, el comportamiento no está definido.

C11 también conocido como ISO / IEC 9899: 2011 dice lo mismo.

Primero debe convertir b al tipo entero objetivo. Otro punto es que debe colocar paréntesis alrededor de los parámetros de macro para evitar sorpresas por precedencia de operadores. Además, el operador de coma es muy útil aquí, ya que le permite evitar las llaves, de modo que la macro se puede utilizar como un comando normal, cerrado con un punto y coma.

#define splitup(a,b,c) ( (b) = (a) >> 32, (c) = (a) & 0xffffffff ) #define combine(a,b,c) ( (a) = ((unsigned long long)(b) << 32) | (c) )

Es posible que se necesiten conversiones adicionales para `dividir para silenciar las advertencias sobre la pérdida de precisión de compiladores sobre paranoicos.

#define splitup(a,b,c) ( (b) = (unsigned long)((a) >> 32), (c) = (unsigned long)((a) & 0xffffffff) )

Y, por favor, ni siquiera piense en usar su cifrado de escritura automática para el código de producción.