Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Importancia de los Bitwise

Estas en el tema de Importancia de los Bitwise en el foro de PHP en Foros del Web. Alguien podría explicarme cual es la importancia de los operadores bit a bit o bitwise, me refiero a en que situaciones de desarrollo reales, o ...
  #1 (permalink)  
Antiguo 10/05/2013, 11:22
 
Fecha de Ingreso: julio-2011
Mensajes: 108
Antigüedad: 12 años, 8 meses
Puntos: 4
Pregunta Importancia de los Bitwise

Alguien podría explicarme cual es la importancia de los operadores bit a bit o bitwise, me refiero a en que situaciones de desarrollo reales, o cotidianas, es necesario o provechoso utilizar estos dichos operadores binarios..

No exijo un respuesta extensa, solo es una curiosidad porque no puedo enteneder en que situacion aprovechar esto.

Desde ya muchas gracias.
Saludos!
  #2 (permalink)  
Antiguo 10/05/2013, 11:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Importancia de los Bitwise

Me parece que es un tema bastante avanzado para que te lo cuestiones, sobre todo por la falta de experiencia, cuando te metas en problemas que requiera manejo de bits entonces ya sabrás.

Por ahora es un tema del cual no deberías preocuparte, pero si de verdad quieres saber más claramente puedes consultar el manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 10/05/2013, 11:28
 
Fecha de Ingreso: julio-2011
Mensajes: 108
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: Importancia de los Bitwise

Gracias pateketrueke, eh estado leyendo el manual en php.net y es por falta de ejemplos mas concretos que me surgio esta pregunta, es probable que no lo entienda por lo que tu dices, me falta mucha experiencia y conocimientos, pero asi y todo si alguien puede contarme o explicarme gruesamente lo que pregunto, me seria genial, ya que no me gusta quedarme con la duda.. si no encuentro la respuesta aqui, la voy a encontrar en otro lado eso te lo puedo asegurar.

Otra vez, gracias por tu respuesta y tu tiempo
Un Saludo!
  #4 (permalink)  
Antiguo 10/05/2013, 11:34
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Importancia de los Bitwise

Un uso para bitwise es, por ejemplo, operaciones sobre colores usando sus representaciones en hexadecimal.

No sabría darte un ejemplo pero lo he visto en librerías para trabajar con CSS.

Pienso que si son importantes pero no indispensables, ya que algunas veces es la mejor forma de operar sin tener que escribir mucho código.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 10/05/2013 a las 11:38 Razón: errata
  #5 (permalink)  
Antiguo 10/05/2013, 11:36
 
Fecha de Ingreso: julio-2011
Mensajes: 108
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: Importancia de los Bitwise

Me parece un buen ejemplo gracias.
  #6 (permalink)  
Antiguo 10/05/2013, 19:07
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 3 meses
Puntos: 20
Respuesta: Importancia de los Bitwise

No soy gran experto en los bitwise, la verdad, pero...
Los bitwise por ejemplo son muy útiles para bitmask.
( Supongo que sabes que son los numeros binarios si llegas a preguntar esta pregunta )
Te dare un ejemplo.
Un sistema de permisos donde tienes:

Cita:
- Usuario (user)
- VIP (vip)
- Moderador (mod)
- Administrador (admin)
A cada uno de estos permisos se le asigna un numero
cada numero decimal tiene su binario correspondiente.

Cita:
User = 1 ( Binary: 0001 )
VIP = 2 ( Binary: 0010 )
Mod = 4 ( Binary: 0100 )
Admin = 8 ( Binary: 1000 )
Como ya sabras las operaciones bitwise se portan con sus operandos como una secuencia de bits. Cojeemos por ejemplo el operario | y los numeros 1 ( 0001 ) y 2 ( 0010 ). El operario | da 1 si el numero "A" o el numero "B" es 1:

Cita:

0001
|
0010
----------
0011 // Resultado
el operario & devuelve 1 SOLO si el numero "A" y el numero "B" son 1:

Cita:
0001
&
0010
----------
0000 // Resultado

0001
&
0001
----------
0001 // Resultado
Sabiendo esto se puede hacer un rang check, log level, buttons to show etc. guapos.
Te dare ejemplos:

RANGOS
Código PHP:

<?php
const RANG_USER 1// Binary: 0001
const RANG_VIP 2// Binary: 0010
const RANG_MOD 4// Binary: 0100
const RANG_ADMIN 8// Binary: 1000

$userRang RANG_VIP RANG_MOD;

if(
!= ($userRang RANG_VIP))
{
    echo 
"Yes";
}

?>
Explico el codigo de arriba.
Se definen 4 rangos ( 4 constantes ) de los usuarios, a cada se le asigna un numero.
Luego le damos al usuario rangos. Que pasa en esta linea:

Cita:
$userRang = RANG_VIP | RANG_MOD;
Ya que usamos el operario | veamos cual seria el valor de $userRang

Cita:
RANG_VIP 0010
|
RANG_MOD 0100
--------------------------
0110
El valor que obtendrá $userRang seria 0110.
En la siguiente linea lo que hacemos es comprobar si el permiso que se pide existe.
Como se hace ?! Comprobando si el contenido de $userRang contiene el valor 1 en la posición requerida.

Cita:
if(0 != ($my_perm & RANG_VIP))
En el caso si que tiene, asi que veamos lo que pasa en esta linea

Cita:
RANG_VIP 0110
&
RANG_VIP 0010
------------------------
0010
en este caso ($my_perm & RANG_VIP) NO es igual a 0 y tendra permisos.
Si queremos subir le rango nada mas movemos 1 bit hacia la izquierda:

Código PHP:
$userCurrentRang RANG_USER//  1 o 0001
$userNewRang RANG_USER << 1// ( movemos 1 bit hacia la izquierda ) 2 o 0010 ( El usuario ya es VIP )
$userToAdmin RANG_USER << 3// ( movemos 3 bits hacia la izquierda ) 8 o 1000 ( El usuario ya es Admin ) 

Como dije se puede usar para otra cosas, digamos botones ( es si programas GUI )
(Usare codigo PHP aun que no se puede hacer , pero es para dar ejemplo)

Código PHP:
<?php
const BTN_NO 1;
const 
BTN_YES 2;
const 
BTN_CANCEL 4;

function 
alertWindow($buttons)
{
    if(
$buttons BTN_YES)
    {
        echo 
"[YES]";
    }
    
    if(
$buttons BTN_NO)
    {
        echo 
"[NO]";
    }
    
    if(
$buttons BTN_CANCEL)
    {
        echo 
"[CANCEL]";
    }
}

alertWindow(BTN_YES BTN_NO);
?>
Lo bueno de esto?
Imaginemos la otra posible forma de este codigo

Código PHP:
<?php
function alertWindow($btnYes$btnNo$btnCancel)
{
    if(
$btnYes == true)
    {
        echo 
"[YES]";
    }
    
    if(
$btnNo == true)
    {
        echo 
"[NO]";
    }
    
    if(
$btnCancel == true)
    {
        echo 
"[CANCEL]";
    }
}

alertWindow(falsefalsetrue);
?>
Para definir que querremos solo el botón cancel necesitamos 3 parámetros, dos de los cuales son absolutamente innecesarios. Usando bitwise solo indicamos que botones necesitamos.

Otro ejemplo de uso similar seran los logs ( que tipos de logs escribir / mostrar y cuales ignorar )

El operario ^ también puede ser muy util. El operario ^ devuelve 1 SOLO cuando numero "A" y numero "B" son distintos.
Un ejemplo de su uso podria ser:

Código PHP:
$firstValue true;
$secondValue false

if(
$firstValue $secondValue)
{
    echo 
"YES";

En este codigo se mostrara YES solo y cuando 1 de las dos variables es true, pero no las 2 a la vez.
Para todo esto de aqui puedo decir que usamos los numeros binarios interruptores on/off ( 0 off y 1 on ).

Como dijo pateketrueke se usan también para hacer operaciones con los colores, por ejemplo cojer en un HEX color cuanto azul/verde/rojo hay.
Los colores se representan en la forma ARGB o ABGR donde

Cita:
A = Alpha/transparency
R = Red
G = Green
B = Blue
La forma standart de escribir los colores en HEX es 0xAARRGGBB donde cada letra representa un numero hexdecimal.
Los primeros dos numeros hexdecimales son los primeros 8 numeros binarios que representan el Alpha, los siguientes 8 bits representan el rojo, despues verde y azul ( Si hablamos de RGB ) . En el color 0x0000FF para cojer la cantidad de color azul que habra que hacer ?!
Primero Convirtamos el hex en binary para poder ver lo mas claro

Cita:
0000FF => 00000000 00000000 11111111
Ahora para extraer el azul, tenemos que borrar o enmascarar todo aquella informacion que no nos hace falta ( en el caso el rojo y el verde )

(el operario & devuelve 1 SOLO si el numero "A" y el numero "B" son 1)

Cita:
0000FF => 00000000 00000000 11111111
&
00000000 00000000 11111111
---------------------------------------------------------
00000000 00000000 11111111

Para mas claridad (ejemplo con el color #0000F5)
0000F5 => 00000000 00000000 11110101
&
00000000 00000000 11111111
-------------------------------------------------------
00000000 00000000 11110101
Un codigo PHP de ejemplo podria ser:

Código PHP:
$color 0xABC5E2;


// 0xFF == 11111111 binary
$red = ($color >> 16) & 0xFF// El rojo son los primeros 8 bits asi que nos movemos 16 bits a la izquierda
$green = ($color >> 8) & 0xFF// El verde es al centro asi que nos movemos 8 bits a la izquierda
$blue $color 0xFF;

echo 
"RED: " $red "<br />";
echo 
"GREEN: " $green "<br />";
echo 
"BLUE: " $blue "<br />"
Bueno mas o menos es esto no se si me explicado bien .. pero espero que te ha servido de algo :))

Saludos.
  #7 (permalink)  
Antiguo 10/05/2013, 19:19
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 3 meses
Puntos: 20
Respuesta: Importancia de los Bitwise

Es me olvido decir :D
Ya que todas las operaciones llegan a convertirse en bits para ganar algo de rendimiento algunas multiplicaciones se pueden hacer simplemente moviendo los bits

Código PHP:
<?php
$number 
2;
$exampleOne $number 32// 64
$exampleTwo $number << 5// log(64)/log(2) - 1 = 5 o ( 2 * 2 * 2 * 2 * 2 *2 )

echo $exampleOne " - " $exampleTwo;
?>
Tambien hay que decir que bitshifting se usa para generar hashes.

Última edición por bulter; 11/05/2013 a las 02:47
  #8 (permalink)  
Antiguo 11/05/2013, 15:18
 
Fecha de Ingreso: julio-2011
Mensajes: 108
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: Importancia de los Bitwise

Gracias por esa explicación tan detallada! excelente.

Etiquetas: Ninguno
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:37.