[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