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.
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
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:
En cuanto a si modifica los primeros o los ultimos bits depende del endianness (http://es.wikipedia.org/wiki/Endianness) de la arquitectura.
Saludos.
Cita de: 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.
Curioso, había leído algo pero nunca sabía porqué era.
se puede acceder a cualquier bit de un byte/WORD/... usando los operadores binarios: | , &
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 ¿?
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.
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
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.
¿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.