2008-11-04 12 views
36

Aunque entiendo el concepto de operadores bitwise, no puedo decir que he encontrado muchos casos de uso durante el proceso de desarrollo web en el que tuve que recurrir al uso de operadores bitwise.Cuándo usar operadores Bitwise durante el desarrollo web?

  • ¿Utiliza Bitwise Operators?
  • ¿Por qué los usa?
  • ¿Cuáles son algunos ejemplos de casos de uso?

Recuerde que esta pregunta está destinada específicamente para el uso de operadores Bitwise en los idiomas web.

+0

No hay nada específico sobre el uso de operadores bit a bit en "lenguajes web". Es tan inútil como preguntar * ¿cuándo usarías un filtro radial de desenfoque en el diseño web? *. Duplicado de http://stackoverflow.com/questions/276706/what-are-bitwise-operators, http://stackoverflow.com/questions/1746613/bitwise-operation-and-usage, http://stackoverflow.com/ preguntas/1167956/resources-to-learn-bitwise-programming y otros. –

Respuesta

47

Mi uso principal para operadores bit a bit podría ser relevante en cualquier lugar, representando un conjunto de banderas. Por ejemplo, puede tener un número entero en la base de datos que represente un conjunto de permisos de seguridad para un usuario, y en su aplicación web debería verificarlos antes de continuar.

Estos tienden a requerir solo & y | - por ejemplo,

if ((permissions & Permission.CreateUser) != 0) 
{ 
    ... 
} 

o

Permission requiredPermission = Permission.CreateUser 
           | Permission.ChangePassword; 

Bit cambio operadores son menos útiles en aplicaciones de "negocios" en mi experiencia.

+16

Downvoters: por favor explique sus votos bajos, o son inútiles. –

+2

+1, pero las operaciones de cambio no son tan inútiles cuando se trata de criptografía. Por ejemplo, MD5 algorythm usa cambios de bit. Puede ser un mal ejemplo porque MD5 ya está implementado en PHP, pero eso fue lo primero que se me vino a la mente. – Hnatt

+5

@Hnatt: Exactamente, no es lógico * business *, a menos que su empresa proporcione funciones de cifrado. –

1

Uso cada tanto pero nunca en lugares donde puedo evitarlos. Lo más a menudo que los he usado son las siguientes dos situaciones.

  1. Encriptando los datos del formulario del cliente utilizando JavaScript cuando no se realiza una conexión segura, no es mucho, pero es mejor que enviar texto sin formato.
  2. Transmitiendo estructuras de archivos (generalmente de tipo binario) de PHP que se generan sobre la marcha.
+1

Algunos ejemplos serían agradables. –

2

Generalmente, no necesita preocuparse por las operaciones en el nivel de bit. Puedes pensar en bytes, ints, dobles y otros tipos de datos de nivel superior. Pero hay momentos en los que le gustaría poder ir al nivel de un bit individual.

Uno de los casos de utilización más comunes de los operadores bit a bit es el flags (ejemplo php). El bitwise operators también se usa en operaciones de archivos binarios IO.

1

En el lado fuera de tema, en los lenguajes de alto nivel, especialmente en lenguajes analizados (como PHP), las operaciones en modo bit son mucho más lentas [cita requerida] que la aritmética normal. Entonces, aunque la comprobación de permisos de Jon podría estar bien desde el punto de vista del rendimiento, no es muy 'nativa' en el dominio web.

6

Además de las banderas, no hay muchas razones para usar operaciones de bits en lenguajes de scripting. Pero una vez que profundizas en los niveles inferiores de tu pila, las operaciones de bits se vuelven cada vez más críticas.

77

Voy a ser más explícito aquí porque creo que las máscaras bit a bit son una gran herramienta que debería estar en cualquier cinturón de desarrolladores. Voy a tratar de ampliar las respuestas anteriores.En primer lugar, un ejemplo de la utilización de un número entero de mantener las banderas del estado (de uso común):

// These are my masks 
private static final int MASK_DID_HOMEWORK = 0x0001; 
private static final int MASK_ATE_DINNER = 0x0002; 
private static final int MASK_SLEPT_WELL = 0x0004; 

// This is my current state 
private int m_nCurState; 

Para establece mi estado, yo uso el operador binario OR:

// Set state for'ate dinner' and 'slept well' to 'on' 
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL); 

Aviso cómo 'o' mi estado actual con los estados en los que quiero activar '. Quién sabe cuál es mi estado actual y no quiero arruinarlo.

Para desarmar mi estado, yo uso el operador AND con el operador de complemento:

// Turn off the 'ate dinner' flag 
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER); 

Para cheque mi estado actual, utilice el operador AND:

// Check if I did my homework 
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) { 
    // yep 
} else { 
    // nope... 
} 

¿Por qué creo que esto es interesante? Digamos que estoy diseñando una interfaz que establece mi estado. Podría escribir un método que acepta tres valores booleanos:

void setState(boolean bDidHomework, boolean bAteDinner, boolean bSleptWell); 

O, podría usar un solo número para representar los tres estados y aprobar un único valor:

void setState(int nStateBits); 

Si elige el segundo patrón que Seré muy feliz cuando decida agregar otro estado: no tendrá que romper las interfaces existentes de su interfaz.

Mis dos centavos. Gracias.

+2

¡Una respuesta muy útil! merece estar en la cima, seguro. – Ace

+21

Personalmente, odio este "patrón" con una venganza. Está muy cerca de la ofuscación del código. –

+6

Aunque le invitamos a su opinión, mantengo que usar campos de bits para almacenar estados puede ser limpio, conciso y, en algunos casos, óptimo. Si la sintaxis lo hace sentir incómodo, empaque las operaciones en métodos de conveniencia específicos del problema y evite exponer la implementación subyacente a su interlocutor. En cuanto a la ofuscación de código, ¿existe un "patrón" que no puede ser ofuscado por un desarrollador inexperto? – tyler

12

Para los programadores de Java, el operador xor bitwise (^) proporciona una forma útil de codificar una prueba OR exclusiva entre dos booleanos. Ejemplo:

boolean isFoo = ... 
boolean isBar = ... 

if (isFoo^isBar) { 
    // Either isFoo is true or isBar is true, but not both. 

Nota: no hay manipulación de bits real pasando aquí, pero es una forma útil de utilizar el operador XOR bit a bit (en la capa web o en cualquier otro lugar).

(mismo puede aplicarse a C#, ya que es muy similar a Java. No es seguro, sin embargo.)

+3

O podría escribir 'if ((isFoo || isBar) && isFoo! = IsBar)' que puede ser más detallado, pero tendrá sentido para cualquier persona sin tener que googlear lo que '^' es. – CorayThan

+1

¿Esto realmente responde cuándo usar operadores bit a bit? –

+1

Simplemente 'isFoo! = IsBar' sería equivalente y más claro. –

0

La única vez que he tenido utilizarlas fuera de autorizar el acceso era para un proyecto que estaba haciendo para una analizador que se asigna a los ID de color enteros

es decir

$color_red= 1; 
$color_blue = 2; 
$color_yellow = 8; 

$color_purple = 3; 
$color_orange = 9; 
$color_green = 10; 

me hicieron entonces una propiedad

$can_collect_200_dollars = 10; 

continuación, utiliza bit a bit para comparar el color dado con la propiedad

if($given_color & $can_collect_200_dollars) 
{ 
    $yay_i_got_200_dollars = true; 
}else{ 
    $bummer_i_am_going_to_jail = true; 
} 
+1

Su ejemplo no explica por qué necesitaba usar un operador bit a bit. – geoidesic

-2

Creo operadores de bits son muy fuertes si se utiliza de forma inteligente.

Supongamos que tiene una "Tienda en línea". Y algunos de sus artículos se incluyen en más de una categoría.

O tiene que crear una relación de Muchos a Muchos. O puede dar a sus Categorías una ID Binaria adicional y en su producto solo almacenar la combinación de Bitwise de Categorías de ID

Creo que en pocas líneas no puedo explicar en detalle. SORRY

+1

Esto también puede ser muy débil si tiene toneladas de categorías. –

+0

Esto no responde la pregunta OP. – MJoraid

+0

Pls edite su respuesta para que pueda eliminar mi voto downvote. Regresaré ahora a todos mis votos negativos e intentaré eliminarlos. – MJoraid

5

Esta pregunta ya está respondida, pero me gustaría compartir mi experiencia con &.

He utilizado & hace poco tiempo para validar un formulario de registro cuando estaba haciendo un ejercicio ASP.NET C# donde el cortocircuitado && no lograría el efecto deseado tan fácilmente.

Lo que quería hacer era resaltar todos los campos no válidos en el formulario y mostrar una etiqueta de mensaje de error al lado de cada campo no válido, desmarcar todos los campos válidos y eliminar los mensajes de error de ellos.

El código que utilicé fue algo como esto:

protected void btnSubmitClicked(...) { 
    username = txtUsername.Text; 
    email = txtEmail.Text; 
    pass = txtPassword.Text; 
    if (isUsernameValid(username) & isEmailValid(email) & isPasswordValid(pass)) { 
    // form is valid 
    } else { 
    // form is invalid 
    } 
    ... 
} 

private bool isPasswordValid(string password) { 
    bool valid = true; 
    string msg = ""; 
    if (password.length < MIN_PASSWORD_SIZE) { 
    valid = false; 
    msg = "Password must be at least " + MIN_PASSWORD_SIZE + " long."; 
    } 

    highlightField(txtPassword, lblPassword, valid, msg); 
    return valid; 
} 

private void highlightField(WebControl field, Label label, string valid, string msg) { 
    if (isValid) { 
    // de-highlight 
    field.BorderColor = VALID_FIELD_COLOR; 
    } else { 
    // highlight the text field and focus on it 
    field.BorderColor = INVALID_FIELD_COLOR; 
    field.Focus(); 
    } 

    label.Text = msg; 
} 

// and other similar functions for username and email 

Si yo utilizo && en lugar de &, la sentencia if en btnSubmitClicked método sería poner de relieve sólo el campo primer inválida, y todos los demás los campos inválidos después de eso no se resaltarían y su mensaje de error no se mostraría porque el cortocircuito && dejaría de verificar la condición después de que se encuentre un falso.

Puede haber una manera mejor de lograr lo mismo, pero encontré & útil en ese momento.

Cuestiones relacionadas