[eside-ghost] Bitwise operations en C
Jon Valdés
juanval en gmail.com
Mie Mar 19 10:54:58 CET 2008
Bueeeenas
2008/3/19 Saúl Ibarra <saghul en gmail.com>:
> y ya por rizar un poco el rizo os pego un trozo de código de la
> aplicación Dial de Asterisk, que me desconcierta un poco más...
>
> ####
> 00222 enum {
> 00223 OPT_ANNOUNCE = (1 << 0),
> 00224 OPT_RESETCDR = (1 << 1),
> 00225 OPT_DTMF_EXIT = (1 << 2),
> 00226 OPT_SENDDTMF = (1 << 3),
> 00227 OPT_FORCECLID = (1 << 4),
> 00228 OPT_GO_ON = (1 << 5),
> 00229 OPT_CALLEE_HANGUP = (1 << 6),
> 00230 OPT_CALLER_HANGUP = (1 << 7),
> 00231 OPT_PRIORITY_JUMP = (1 << 8),
> 00232 OPT_DURATION_LIMIT = (1 << 9),
> 00233 OPT_MUSICBACK = (1 << 10),
> [...]
Todo esto es porque, en binario:
1<<0 = 1
1<<1 = 10
1<<2 = 100
1<<3 = 1000
1<<4 = 10000
etc
Y es mucho mas facil comprobar los numeros cuando son 1,2,3,4,5,...
que cuando son 10,100,1000,10000,100000,... que te pierdes contando
ceros :)
Y si tu pregunta iba más bien que a ver por qué se hacen los defines
con esos números, es para poder usar bitmasks para comprobar si un bit
está puesto a 1, y así poder almacenar 32 datos en una variable de 32
bits, por ejemplo.
En este caso, por ejemplo, si te llega una variable de 32 bits y
quieres comprobar si tiene puesto a 1 el valor correspondiente a
OPT_MUSICBACK, solo tienes que usar el and binario, y hacer un
if(variable&OPT_MUSICBACK!=0)
hazloquesea;
O simplificando,
if(variable&OPT_MUSICBACK)
hazloquesea;
:-)
Taluegoooooo
Más información sobre la lista de distribución eside-ghost