Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Operaciones binarias en C

Estas en el tema de Operaciones binarias en C en el foro de C/C++ en Foros del Web. Hola. Tengo un problema. Por ejemplo tengo una variable de 2 bytes(word) AF donde de forma alegorica A son los 8 bits de arriba y ...
  #1 (permalink)  
Antiguo 02/04/2006, 11:48
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Operaciones binarias en C

Hola. Tengo un problema.
Por ejemplo tengo una variable de 2 bytes(word) AF donde de forma alegorica A son los 8 bits de arriba y F los de abajo.
Ahora. Estoy intentando hacer un #define donde pueda modificar los valores de arriba y de abajo por separado.
#define A(n) cpu.AF&=0xFF|(n<<8)
#define F(n) cpu.AF&=0xFF00|n

Es esto correcto?
Se puede hacer de una manera mas rapida?

Saludos
  #2 (permalink)  
Antiguo 03/04/2006, 03:02
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Es muy correcto. Sobre si hay una forma más rápida... mejor hacer pruebas. Este que sigue es mi método favorito, aunque debes tener en cuenta el "endianness" de tu procesador:

Código:
//Para little-endian (eg: X86):
 #define A(n) ((unsigned char *)&cpu.AF)[1] = n;
 #define F(n) ((unsigned char *)&cpu.AF)[0] = n;

//Para big-endian (eg: Motorola):
  #define A(n) ((unsigned char *)&cpu.AF)[0] = n;
  #define F(n) ((unsigned char *)&cpu.AF)[1] = n;
  #3 (permalink)  
Antiguo 03/04/2006, 20:17
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Estoy manejando un "little endian"
Y bueno, aun no puedo probar si funciona porque mi aplicacion es enorme.
Por eso mas vale preguntar.

Saludos
  #4 (permalink)  
Antiguo 26/04/2006, 06:31
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Instru tu idea es muy creativa, seria posible?

cpu.AF = (unsigned char)n;
cpu.AF = (unsigned char)(n << 8);
  #5 (permalink)  
Antiguo 26/04/2006, 14:54
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Cita:
Instru tu idea es muy creativa, seria posible?

cpu.AF = (unsigned char)n;
cpu.AF = (unsigned char)(n << 8);
No, porque tengo que modificar los primeros 8 bits por separado y los segundos 8 bits aparte. Por eso creo macros, para hacerlo con una sola instruccion.

Saludos
  #6 (permalink)  
Antiguo 27/04/2006, 09:50
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Podrías empezar a usar C++ y evitar guarrerías, mira esto:

Código:
inline unsigned short int & SetWordHigh(unsigned short int & Word, unsigned char & HighByte) { reinterpret_cast<unsigned char*>(&Word)[1] = HighByte; return Word; }
inline unsigned short int & SetWordLow (unsigned short int & Word, unsigned char & LowByte)  { reinterpret_cast<unsigned char*>(&Word)[0] = LowByte; return Word; }
Serán igual que los #defines pero creando símbolos, posibilidad de debug y comprobación de tipos.

En este código, el reinterpret_cast (quizás-no-portable) creo que no es sustituible por el static_cast (portable).

Pero no me hagas mucho, sería probarlo y ver si cuela el static_cast. Acabo de formatear y no lo tengo disponible, sorry :P Luego paso a Debian y te digo si va allí.

Última edición por MaxExtreme; 27/04/2006 a las 09:56
  #7 (permalink)  
Antiguo 27/04/2006, 14:44
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Bueno, ya estoy usando otro metodo.
Lo que en relidad busco es portabilidad y eficiencia al maximo posible.
Saludos
  #8 (permalink)  
Antiguo 27/04/2006, 14:57
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Bueno, esa manera de C++ te va a dar la misma portabilidad y eficiencia, aun incluso más que C.

Primero, porque se definen operadores concretos y es más portable eso, que es fácil cambiarlo, que un sinfin de defines ;)
Segundo, porque son funciones, no #defines.
Tercero, porque son inlines, es decir, funcionarán como un #define de C.
Cuarto, te permiten debuggear.

En realidad lo mejor es agrupar en un namespace las funciones consideradas que podrían no ser siempre portables, bien porque usen castings reinterpret_cast o tipo C, bien porque usen librerías externas, etc.

Así el que quiera portar, sólo se pega con ese código.
  #9 (permalink)  
Antiguo 27/04/2006, 15:31
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
No me referia a los defines. Con el otro metodo me referia a OTRO metodo.
Ya lo has visto en el otro post.
Al parecer la idea no funciona, tal vez si sobrecargara el operador de asigancion podria funcionar.

SAludos
  #10 (permalink)  
Antiguo 27/04/2006, 15:33
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Bueno, has dicho "otro método", y supuse que hablabas de lo que iba el tema de conversación.

Sigo sin entender eso de "la idea no funciona, tal vez si sobrecargara el operador de asigancion podria funcionar."
  #11 (permalink)  
Antiguo 27/04/2006, 15:40
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Bueno, estoy usando campos de bits. Puedes checar mi otro past para que te des una idea.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:06.