Acabo de entrar en los foros por culpa de JuanK
Estaba mirando los retos y he visto este: Bitwise Operations
Solo quería dar mi solución:
CODE
int checkOverflow( unsigned n1, unsigned n2 )
{
int mask = 0x80;
while( mask & ((n1 & mask) ^ (n2 & mask)) ) {
mask >>= 1;
mask &= 0x7fffffff;
}
return mask & (n1 & mask) & (n2 & mask);
}
Esta función devuelve verdadero si hay desbordamiento al sumar los números.
Es para enteros de 4 bytes, pero es fácil modificarlo para otros tamaños.
P.D.: El hilo del reto está cerrado, así que pongo mi solución aquí (pido perdón si no es el lugar apropiado).
:think: hay algo extraño en este mensaje pero no importa :lol: .No sé que tiene de extraño mi mensaje... ni sé porqué no te crees que acabe de entrar a los foros (aunque esto lo borraste). Solo tienes que mirar mi fecha de registro.
¿ y como funciona ?No sabía ese truco, me lo apunto.
para saber si hay desborde al sumar dos enteros solo tienes que hacer ~A>=B si esto es falso hay desborde si es verdadero no hay desborde en la suma
¿ por que funciona ?
es muy facil...
3º Tu método usa una comparación, lo que significa que hace una resta. Eso me da que no sería válido para el reto.
el >= no es una resta ya que el compilador lo convierte en un JB o en un JNAE segun sea mas conveniente, esta instruccion se realiza en un solo ciclo de procesamiento cosa que en una resta se haria en dos ciclos usando posiblemente SUB y una instruccion de transferencia como JA JB o las otras...Efectivamente, antes del salto condicional tiene que ir algo, en este caso concreto un CMP o un TEST, que lo que hacen es una RESTA.
Problema a solucionar por medio de operaciones con bits : (&,|,^,~,>>,<<)Se supone que esos son los únicos operadores permitidos, ¿no?
Description
CMP subtracts the second operand from the first but, unlike the SUB instruction, does not store the result; only the flags are changed. CMP is typically used in conjunction with conditional jumps and the SETcc instruction. (Refer to Appendix D for the list of signed and unsigned flag tests provided.) If an operand greater than one byte is compared to an immediate byte, the byte value is first sign-extended.
...(subtraction instructions SUB, SBB, DEC, AAS, DAS, CMP, and NEG)...
2º No sé si eres bueno... pero lo que tengas de bueno te falta en educación. No sé a qué viene dudar de mí nada más llegar, pero bueno... ya he visto otros mensajes tuyos en el foro y veo que la educación no es tu fuerte *mira a Nagisa*... simplemente te ignoraré.
Esta función devuelve verdadero si hay desbordamiento al sumar los números.
Es para enteros de 4 bytes, pero es fácil modificarlo para otros tamaños.
3º Tu método usa una comparación, lo que significa que hace una resta. Eso me da que no sería válido para el reto.
Bueno si mi programa no es valido porque genera instrucciones equivalentes a una resta tu programa tampoco seria valido porque la operación >>1 es equivalente a dividir entre 2 no estoy diciendo que genera las mismas instrucciones en ensamblador estoy diciendo que mask >>= 1 es equivalente a mask /=2 ; en el programa que fue enviado antes por nagisa como solución a este reto se uso el operador != y aun así fue considerado como valido .Esto demuestra que no sabes cómo salirte con la tuya.