elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Operadores con bits - consulta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Operadores con bits - consulta  (Leído 1,989 veces)
HRSLASH

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Operadores con bits - consulta
« en: 5 Noviembre 2012, 19:14 pm »

Hola foreros. Tengo este codigo y lo que quiero es que devuelva 1 si el simbolo pasado a la funcion es alguno de los definidos arriba. Habia pensado en hacerle un corrimiento de bits dependiendo la posicion del bit encendido. por ej >> (int)sqrt(0x3FF % sym + 1) pero el problema es que este metodo no funciona con algunas constantes.. como puedo saber la posicion del bit encendido para moverlo y que si el argumento concuerde con alguna constante devuelva 1?

Código
  1.  
  2. #define BACKSLASH 0x0001
  3. #define SLASH     0x0002
  4. #define COLON     0x0004
  5. #define ASTERISK  0x0008
  6. #define QUESTION  0x0010
  7. #define QUOTES    0x0020
  8. #define LESS      0x0040
  9. #define GREATER   0x0080
  10. #define PIPE      0x0100
  11.  
  12. int is_symbol(int sym)
  13. {
  14.    return ((BACKSLASH | SLASH | COLON | ASTERISK | QUESTION | QUOTES | LESS | GREATER | PIPE) & sym);
  15. }
  16.  
  17.  

Gracias de antemano!  :D


En línea

La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Operadores con bits - consulta
« Respuesta #1 en: 5 Noviembre 2012, 20:40 pm »

El problema son los valores que puede estar tomando sym, es decir si el valor de sym no es potencia de dos te va a dar problemas


En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Operadores con bits - consulta
« Respuesta #2 en: 5 Noviembre 2012, 23:20 pm »

Código
  1. return ((BACKSLASH | SLASH | COLON | ASTERISK | QUESTION | QUOTES | LESS | GREATER | PIPE) & sym);

hola, no entiendo muy bien lo que haces pues estas haciendo un OR con todas las constantes. esto se traduce en que las estas sumando a nivel de bit. como ejemplo mas sencillo para que veas lo que pasa, mira esto:

Código:
a = 4 = ...0100
b = 6 = ...0110
a | b = 4 | 6 = ...0110 = 6

como veras, no tiene mucho sentido para hacer lo que tu quieres hacer ya que acabas haciendo un AND con algo extraño que no representa nada. ademas, si fuera el caso de que eso fuera correcto, tu funcion seguiria sin devolver 1 o 0, ya que por ejemplo, si el simbolo fuera el QUESTION:

Código:
QUESTION=0x10
sym=0x10
QUESTION & sym = 0x10 = 16

asi pues tu funcion devolveria 16. no te olvides que las operaciones a nivel de bit son en paralelo, es decir, el bit 0 de un numero con el bit 0 del otro, el bit 1 con el bit 1, etc.

en lugar de eso, si lo que quieres es que la funcion devuelva 1 cuando coincida con alguna de las constantes, y quieres hacerlo aplicando alguna operacion a nivel de bits, una solucion podria ser esta:

Código
  1. #define BACKSLASH 0x0001
  2. #define SLASH     0x0002
  3. #define COLON     0x0004
  4. #define ASTERISK  0x0008
  5. #define QUESTION  0x0010
  6. #define QUOTES    0x0020
  7. #define LESS      0x0040
  8. #define GREATER   0x0080
  9. #define PIPE      0x0100
  10.  
  11. #define NUMSYM 9
  12.  
  13. int is_symbol(int sym) {
  14.  
  15. int i, symbols[]={BACKSLASH, SLASH, COLON, ASTERISK, QUESTION, QUOTES, LESS, GREATER, PIPE};
  16.  
  17. for (i=0; i<NUMSYM; i++)
  18. if (symbols[i]^sym == 0) return 1;
  19.  
  20. return 0;
  21. }

donde uso la operacion XOR que dara 0 si los dos numeros son iguales. como veras es lo mismo que usar en la condicion del if un symbols[ i]==sym, pero lo puse por pedir que fuera con operaciones de bits.

si lo que quieres es que la funcion sea de 1 solo return, esto te podria servir:

Código
  1. int is_symbol(int sym) {
  2.  
  3. return !(BACKSLASH^sym && SLASH^sym && COLON^sym && ASTERISK^sym && QUESTION^sym && QUOTES^sym && LESS^sym && GREATER^sym && PIPE^sym);
  4. }

aunque sinceramente no se que tan eficiente es respecto a la primera version que es mas facil de entender.

un saludo!
« Última modificación: 6 Noviembre 2012, 00:11 am por xiruko » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Operadores con bits - consulta
« Respuesta #3 en: 6 Noviembre 2012, 17:01 pm »

si lo que quieres es que la funcion sea de 1 solo return, esto te podria servir:

Código
  1. int is_symbol(int sym) {
  2.  
  3. return !(BACKSLASH^sym && SLASH^sym && COLON^sym && ASTERISK^sym && QUESTION^sym && QUOTES^sym && LESS^sym && GREATER^sym && PIPE^sym);
  4. }

aunque sinceramente no se que tan eficiente es respecto a la primera version que es mas facil de entender.
Tiene la misma eficiencia. Ello porque en el caso de operador lógico AND si el operando a la izquierda es falso el derecho no se evalúa, en otras palabras la evaluación termina en cuanto uno de los operando en tu expresión sea cero (indicando que coincidió con alguna de las macros).

Hola foreros. Tengo este codigo y lo que quiero es que devuelva 1 si el simbolo pasado a la funcion es alguno de los definidos arriba.
Eso implica que se deben cumplir tres condiciones:
1) Ser mayor o igual que 1.
2) Ser menor o igual que 256.
3) Ser una potencia de dos (en binario el numero tiene solo un bit a uno).

Combinando los tres tenemos:
Código
  1. int is_symbol(int x)
  2. {
  3.   return x >= 1 && x <= 256 && (x & x - 1) == 0;
  4. }

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
HRSLASH

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: Operadores con bits - consulta
« Respuesta #4 en: 6 Noviembre 2012, 17:16 pm »

Muchas gracias a todos por las respuestas! Finalmente me he quedado con la que propuso rir3760 funciona perfecto!!  :D
En línea

La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA!!!!! Con operadores de bits..
Java
AngeloX901 2 2,208 Último mensaje 7 Julio 2009, 20:17 pm
por AngeloX901
Operadores de bits
Programación C/C++
david_BS 3 2,680 Último mensaje 4 Abril 2012, 22:37 pm
por durasno
Operadores a nivel de bits (lenguaje C). « 1 2 »
Programación C/C++
NOB2014 16 7,967 Último mensaje 21 Marzo 2014, 15:16 pm
por Yoel Alejandro
Operadores de manejo de bits
Java
m@o_614 2 1,122 Último mensaje 16 Enero 2015, 22:38 pm
por ivancea96
Operadores de bits ?? « 1 2 »
Programación C/C++
FKT 10 2,385 Último mensaje 7 Septiembre 2015, 18:09 pm
por FKT
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines