Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 22 Abril 2016, 23:51 pm



Título: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: NOB2014 en 22 Abril 2016, 23:51 pm
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?.-

Código
  1. #include<stdio.h>
  2.  
  3. int main( void ){
  4. int numero = 12345, i, b = 1, temp = 0, x;
  5.  
  6. for( i = 0; i < 32; i++ ){
  7. temp += numero & b;
  8. x = numero & b;
  9. if( x > 0 ) printf("\n bit encendido ==> [%2d] = %d", i, x);
  10. b <<= 1;
  11. }
  12.  
  13. printf( "\n\n La direccion de memoria %p contiene el valor %d\n\n", &numero, temp );
  14.  
  15. return 0;
  16. }

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


Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: MAFUS en 23 Abril 2016, 10:06 am
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.


Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: NOB2014 en 23 Abril 2016, 17:00 pm
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


Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: MAFUS en 23 Abril 2016, 18:13 pm
Yo he hecho el siguiente código que, a diferencia del tuyo, destruye la variable original.

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main() {
  5.    unsigned num = -12345;
  6.    unsigned resultado;
  7.    int d = 1;
  8.  
  9.    while(num) {
  10.        resultado ^= d * (num & 1);
  11.        num >>= 1;
  12.        d <<= 1;
  13.    }
  14.    printf("El número buscado es %i", resultado);
  15.  
  16.    return 0;
  17. }


Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: geeke en 23 Abril 2016, 19:53 pm
Sin usar el identificador  :silbar:

Código
  1. unsigned num = 12345;
  2. unsigned *ptr = &num;
  3.  
  4. printf( "\nLa direccion %p contiene el valor %d\n\n", &ptr, *ptr );



Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: MAFUS en 23 Abril 2016, 20:10 pm
Jaja, sí, pero creo que la idea de NOB2014 no iba por ahí  :¬¬


Título: Re: Averiguar valor de variable sin utilizar el identificador de la misma.[C]
Publicado por: NOB2014 en 23 Abril 2016, 20:22 pm
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