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 ...
 
Antiguo 02/04/2006, 11:48
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
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
 
Antiguo 03/04/2006, 03:02
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 24 años, 9 meses
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;
 
Antiguo 03/04/2006, 20:17
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
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
 
Antiguo 26/04/2006, 06:31
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 20 años, 4 meses
Puntos: 2
Instru tu idea es muy creativa, seria posible?

cpu.AF = (unsigned char)n;
cpu.AF = (unsigned char)(n << 8);
 
Antiguo 26/04/2006, 14:54
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
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
 
Antiguo 27/04/2006, 09:50
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 21 años, 5 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
 
Antiguo 27/04/2006, 14:44
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
Puntos: 52
Bueno, ya estoy usando otro metodo.
Lo que en relidad busco es portabilidad y eficiencia al maximo posible.
Saludos
 
Antiguo 27/04/2006, 14:57
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 21 años, 5 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.
 
Antiguo 27/04/2006, 15:31
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
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
 
Antiguo 27/04/2006, 15:33
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 21 años, 5 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."
 
Antiguo 27/04/2006, 15:40
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 23 años, 10 meses
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 08:32.