Autor
|
Tema: DUDA : Punteros a bits individuales y su manipulacion (Leído 5,763 veces)
|
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.
|
|
|
En línea
|
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general
USA LINUX
|
|
|
durasno
Desconectado
Mensajes: 373
|
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) 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: 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
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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 ,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 ,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!
|
|
« Última modificación: 19 Enero 2013, 21:22 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
En cuanto a si modifica los primeros o los ultimos bits depende del endianness de la arquitectura. Saludos.
|
|
|
En línea
|
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
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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.
|
|
|
En línea
|
Regístrate en
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
se puede acceder a cualquier bit de un byte/WORD/... usando los operadores binarios: | , &
|
|
|
En línea
|
|
|
|
lucaslopez0000
|
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 ¿?
|
|
|
En línea
|
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general
USA LINUX
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.908
|
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.
|
|
« Última modificación: 20 Enero 2013, 18:43 pm por x64Core »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda sobre manipulacion de memoria
Programación Visual Basic
|
DarkObi
|
1
|
1,689
|
30 Diciembre 2005, 22:05 pm
por Slasher-K
|
|
|
Punteros ensamblador 16 bits
ASM
|
farresito
|
3
|
6,012
|
29 Agosto 2010, 01:12 am
por 08l00D
|
|
|
manipulación de punteros (ejemplo con float)
Programación C/C++
|
david_BS
|
0
|
1,900
|
3 Abril 2012, 03:26 am
por david_BS
|
|
|
Duda Punteros Dobles/Array de punteros
Programación C/C++
|
MisterJava
|
2
|
5,167
|
30 Diciembre 2012, 20:19 pm
por MisterJava
|
|
|
campos de bits + punteros + macros
Programación C/C++
|
michael_753
|
1
|
2,594
|
24 Octubre 2023, 14:12 pm
por MAFUS
|
|