Hola gente.
Como veo que por allí MAFUS hizo un desafío, bueno esto es algo parecido solo que yo no tengo suficientes conocimientos para desafiar a nadie, la consulta es ¿conocen otra manera para logrear lo mismo?.-
#include<stdio.h>
int main( void ){
int numero = 12345, i, b = 1, temp = 0, x;
for( i = 0; i < 32; i++ ){
temp += numero & b;
x = numero & b;
if( x > 0 ) printf("\n bit encendido ==> [%2d] = %d", i, x);
b <<= 1;
}
printf( "\n\n La direccion de memoria %p contiene el valor %d\n\n", &numero, temp );
return 0;
}
Cuando el número es positivo, el simple pero cuando es negativo se me complica un poco entenderlo.-
(http://i64.tinypic.com/dg3vh1.png)
(http://i63.tinypic.com/21ngk6e.png)
Saludos.
Daniel
Cuando el número es negativo está en complemento a 2 (usado en arquitecturas de PC, otras pueden usar otro tipo de representación). Para que un entero sea negativo el bit de mayor peso debe estar a 1.
Ahora, en cada iteración de tu programa generas un valor, x, que no llega a tener el bit de mayor peso a 1 hasta el final. Por esa razón C interpreta que tiene un número grande todo el rato.
Hola MAFUS. -
Gracias por ocuparte, tengo bastante claro como funciona todo, en definitiva, si no me contestaron ivancea96, AlbertoBSD, engel lex, no debe haber otra manera de lograr lo mismo, aunque mi subconsiente me dice que si, no creo que el compilador utilice esta fórmula. -
Seguiremos investigando.-
Un abrazo.
Daniel
Yo he hecho el siguiente código que, a diferencia del tuyo, destruye la variable original.
#include <stdio.h>
#include <math.h>
int main() {
unsigned num = -12345;
unsigned resultado;
int d = 1;
while(num) {
resultado ^= d * (num & 1);
num >>= 1;
d <<= 1;
}
printf("El número buscado es %i", resultado);
return 0;
}
Sin usar el identificador :silbar:
unsigned num = 12345;
unsigned *ptr = #
printf( "\nLa direccion %p contiene el valor %d\n\n", &ptr, *ptr );
Jaja, sí, pero creo que la idea de NOB2014 no iba por ahí :¬¬
Hola.
vaya manera de menospreciarme amigo Geeke, te imaginaras si estoy urgndo en como hace ciertas cosas los compiladores debería tener conocimiento de tú código, no te parece.
Igual muchas gracias por ocuparte y como a MAFUS me has arrancado una sonrrrisa.-
Un abrazo.
Daniel