DUDA : Punteros a bits individuales y su manipulacion

Iniciado por lucaslopez0000, 19 Enero 2013, 18:37 PM

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

lucaslopez0000

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.
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

durasno

Citar1) 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)


Citar2)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:
short int *p;
char a='h';
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
Ahorrate una pregunta, lee el man

avesudra

#2
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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* binario(unsigned short int num)
{
    char *numeroBin = calloc(16,1);
    char *strReturn = calloc(16,1);
    for(int i = 0;num;i++)
    {
     numeroBin[i]=(num%2)+48;
     num/=2;
    }
    for(int i = 16 -strlen(numeroBin);i!=0;--i)
    {
        strcat(strReturn,"0");
    }
    strcat(strReturn,strrev(numeroBin));
    return strReturn;
}
int main(int argc, char *argv[])
{
   short int valor2 = 0;
   char *valor =&valor2;
   *valor = 0xFF;   //Aquí cambiamos la parte baja
   *(valor+1)= 0x0F;//Aquí cambiamos la parte alta
   printf("%s\n",binario(valor2));
   return 0;
}

Un ejemplo de como hacer que se active el bit 1 y el 8 de la variable valor con la puerta lógica or.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* binario(unsigned short int num)
{
    char *numeroBin = calloc(16,1);
    char *strReturn = calloc(16,1);
    for(int i = 0;num;i++)
    {
     numeroBin[i]=(num%2)+48;
     num/=2;
    }
    for(int i = 16 -strlen(numeroBin);i!=0;--i)
    {
        strcat(strReturn,"0");
    }
    strcat(strReturn,strrev(numeroBin));
    return strReturn;
}
int main(int argc, char *argv[])
{
   char valor = 0;
   valor |= 0x81;//Activamos el primer bit y el último.
   printf("Valor: %d\nBinario: %s ", valor,binario(valor);
   return 0;
}


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

¡Saludos! :rolleyes:
Regístrate en

0xDani

En cuanto a si modifica los primeros o los ultimos bits depende del endianness de la arquitectura.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

avesudra

Cita de: 0xDani en 19 Enero 2013, 21:01 PM
En cuanto a si modifica los primeros o los ultimos bits depende del endianness de la arquitectura.

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

x64core

se puede acceder a cualquier bit de un byte/WORD/... usando los operadores binarios: | , &

lucaslopez0000

Cita de: x64Core en 20 Enero 2013, 00:45 AM
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 ¿?
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

0xDani

Cita de: lucaslopez0000 en 20 Enero 2013, 15:39 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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

rir3760

Cita de: lucaslopez0000 en 20 Enero 2013, 15:39 PMPor 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

x64core

#9
Luce como que no han leído ni siquiera algo básico de C/C++

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.