Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lucaslopez0000 en 19 Enero 2013, 18:37 pm



Título: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: lucaslopez0000 en 19 Enero 2013, 18:37 pm
Hola a todos. He estado leyendo sobre los punteros en C y me parecen muy utiles. Pero tengo varias preguntas
1) Si tengo un int ( 32 bits ) que vale 16
en binario 00000000000000000000000000010000
¿ Puedo crear un puntero a un bit concreto para modificarlo a voluntad ?
2) ( No es una pregunta que haya leido sino experiencia propia )
Si apunto un char ( 8 bits ) en la posicion de memoria de un short int ( 16 bits )
y cambio el char , ¿ Cambiarian los 8 primeros bits del int o los 8 ultimos ?
Muchas gracias.


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: durasno en 19 Enero 2013, 20:12 pm
Citar
1) Si tengo un int ( 32 bits ) que vale 16
en binario 00000000000000000000000000010000
¿ Puedo crear un puntero a un bit concreto para modificarlo a voluntad ?
hasta donde tengo entendido eso no es posible. Para modificar un bit vas a necesitar una mascara(tema: operadores de bit)


Citar
2)Si apunto un char ( 8 bits ) en la posicion de memoria de un short int ( 16 bits )
y cambio el char , ¿ Cambiarian los 8 primeros bits del int o los 8 ultimos ?
La verdad no se entiende, te referis a algo como:
Código
  1. short int *p;
  2. char a='h';
  3. p=&a;
esto daria un warning, habria que hacer un cast


Saludos

PD: nose cual es tu objetivo, pero tal vez tambien te interese el tema: campos de bit


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: avesudra en 19 Enero 2013, 20:37 pm
Desde C no es posible modificar bits individuales, lo de los campos de bits no es portable entre compiladores por lo que tendrás que usar máscaras como dice durasno.Si apuntas a un short int en teoría te cambiaría los 8 últimos.Para eso puedes practicar con este código:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char* binario(unsigned short int num)
  5. {
  6.    char *numeroBin = calloc(16,1);
  7.    char *strReturn = calloc(16,1);
  8.    for(int i = 0;num;i++)
  9.    {
  10.     numeroBin[i]=(num%2)+48;
  11.     num/=2;
  12.    }
  13.    for(int i = 16 -strlen(numeroBin);i!=0;--i)
  14.    {
  15.        strcat(strReturn,"0");
  16.    }
  17.    strcat(strReturn,strrev(numeroBin));
  18.    return strReturn;
  19. }
  20. int main(int argc, char *argv[])
  21. {
  22.    short int valor2 = 0;
  23.    char *valor =&valor2;
  24.    *valor = 0xFF;   //Aquí cambiamos la parte baja
  25.    *(valor+1)= 0x0F;//Aquí cambiamos la parte alta
  26.    printf("%s\n",binario(valor2));
  27.    return 0;
  28. }
  29.  
Un ejemplo de como hacer que se active el bit 1 y el 8 de la variable valor con la puerta lógica or.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char* binario(unsigned short int num)
  5. {
  6.    char *numeroBin = calloc(16,1);
  7.    char *strReturn = calloc(16,1);
  8.    for(int i = 0;num;i++)
  9.    {
  10.     numeroBin[i]=(num%2)+48;
  11.     num/=2;
  12.    }
  13.    for(int i = 16 -strlen(numeroBin);i!=0;--i)
  14.    {
  15.        strcat(strReturn,"0");
  16.    }
  17.    strcat(strReturn,strrev(numeroBin));
  18.    return strReturn;
  19. }
  20. int main(int argc, char *argv[])
  21. {
  22.    char valor = 0;
  23.    valor |= 0x81;//Activamos el primer bit y el último.
  24.    printf("Valor: %d\nBinario: %s ", valor,binario(valor);
  25.    return 0;
  26. }

Deberías echarle un vistazo a esto: http://www.bitschips.com/infoind/prg_msc.pdf

¡Saludos! :rolleyes:


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: 0xDani en 19 Enero 2013, 21:01 pm
En cuanto a si modifica los primeros o los ultimos bits depende del endianness (http://es.wikipedia.org/wiki/Endianness) de la arquitectura.

Saludos.


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: avesudra en 19 Enero 2013, 21:17 pm
En cuanto a si modifica los primeros o los ultimos bits depende del endianness (http://es.wikipedia.org/wiki/Endianness) de la arquitectura.

Saludos.
Curioso, había leído algo pero nunca sabía porqué era.


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: x64core en 20 Enero 2013, 00:45 am
se puede acceder a cualquier bit de un byte/WORD/... usando los operadores binarios: | , &


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: lucaslopez0000 en 20 Enero 2013, 15:39 pm
se puede acceder a cualquier bit de un byte/WORD/... usando los operadores binarios: | , &

Por lo que he leido esos operadores sirven para otros propositos , ¿ Como lo haces ???
Pon algun codigo

PD : Muchas gracias a todos por sus respuestas , me aclararon mucho
PD2 : Al poner etiquetas de codigo solo veo una parte del codigo ... ¿ Y eso ? No sera xq estoy navegando con el celular ¿?


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: 0xDani en 20 Enero 2013, 17:13 pm
PD2 : Al poner etiquetas de codigo solo veo una parte del codigo ... ¿ Y eso ? No sera xq estoy navegando con el celular ¿?

Tambien me pasa con el movil.


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: rir3760 en 20 Enero 2013, 17:37 pm
Por lo que he leido esos operadores sirven para otros propositos
Supongo es una confusión al pensar en los operadores lógicos AND y OR ("&&" y "||"), estos resultan en el valor 1 o cero dependiendo si se cumple o no la condición.

Los operadores a nivel de bits AND, OR y XOR ("&", "|" y "^") permiten realizar las mentadas operaciones con valores de tipo int.

Para ejemplos nada mejor que utilizar el motor de búsqueda de los foros.

Un saludo


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: x64core en 20 Enero 2013, 18:39 pm
Luce como que no han leído ni siquiera algo básico de C/C++ (http://www.cprogramming.com/tutorial/bitwise_operators.html)

Existen bastante operadores para la manipulación a nivel de bit. aunque no todos comparado con Ensamblador, este tiene aún más. en todo caso se pueden hacer implementaciónes también.


Título: Re: DUDA : Punteros a bits individuales y su manipulacion
Publicado por: Foxy Rider en 21 Enero 2013, 18:37 pm
¿Querés extraer un bit? ignorá los primeros posts ... tanto quilombo al divino pedo, hacés un simple operador de bit shift y a la lona, tenés el bit que te interesa.
A otrx usuarix le había explicado un poco sobre manipular bits, fijate si se entiende → http://foro.elhacker.net/programacion_cc/ayuda_con_este_codigo-t368590.0.html;msg1772216#msg1772216

Podés extraer y modificar cualquier bit individual, punto.

Saludos.