Averiguar valor de variable sin utilizar el identificador de la misma.[C]

Iniciado por NOB2014, 22 Abril 2016, 23:51 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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.-




Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

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.

NOB2014

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

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;
}

geeke

Sin usar el identificador  :silbar:

Código (cpp) [Seleccionar]
unsigned num = 12345;
unsigned *ptr = &num;

printf( "\nLa direccion %p contiene el valor %d\n\n", &ptr, *ptr );



MAFUS

Jaja, sí, pero creo que la idea de NOB2014 no iba por ahí  :¬¬

NOB2014

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-