traduccion operadores bitwise bit-manipulation

bit-manipulation - operadores - bitwise traduccion



¿Cuándo usar operadores Bitwise durante el desarrollo web? (10)

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.

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.

  • ¿Usas Operadores Bitwise?
  • ¿Por qué los usas?
  • ¿Cuáles son algunos ejemplos de casos de uso?

Recuerde que esta pregunta está específicamente destinada al uso de operadores bitwise en los idiomas web.


En el lado fuera de tema, en los lenguajes de alto nivel, especialmente en los 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.


Generalmente, no necesita preocuparse por las operaciones en el nivel de bits. 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 son las banderas (ejemplo php). Los operadores bit a bit también se usan en operaciones de archivos binarios IO.


Los uso de vez en cuando pero nunca en lugares donde puedo evitarlos. Lo más a menudo que los he usado son las siguientes dos situaciones.

  1. Cifrar los datos del formulario del cliente que utiliza JavaScript cuando no está sobre una conexión segura, no es mucho, pero es mejor que enviar texto sin formato.
  2. Transmitiendo estructuras de archivos (generalmente algunos tipos de archivos binarios) desde PHP que se generan sobre la marcha.

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.

Esos tienden a solo requerir & y | - p.ej

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

o

Permission requiredPermission = Permission.CreateUser | Permission.ChangePassword;

Los operadores de cambio de bit son menos útiles en aplicaciones "comerciales" en mi experiencia.


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: aquí no se está manipulando ningún bit, pero es una forma útil de usar el operador xor bitwise (en el nivel web o en cualquier otro lugar).

(Lo mismo puede aplicarse a C #, ya que es muy similar a Java. Sin embargo, no estoy seguro).


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. Primero, un ejemplo de usar un número entero para mantener indicadores de estado (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 establecer mi estado, utilizo el operador OR bit a bit:

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

Observe 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 desactivar mi estado, utilizo el operador AND bit a bit con el operador del complemento:

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

Para verificar mi estado actual, uso 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 acepte tres booleanos:

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

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

void setState( int nStateBits);

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

Mis dos centavos. Gracias.


La única vez que tuve que usarlos fuera de autorizar el acceso fue para un proyecto que estaba haciendo para un analizador que tomaba identificadores de color asignados a ints

es decir

$color_red= 1; $color_blue = 2; $color_yellow = 8; $color_purple = 3; $color_orange = 9; $color_green = 10;

entonces me dieron una propiedad

$can_collect_200_dollars = 10;

luego se usa 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; }


Creo que los operadores bit a bit son muy fuertes si se usan inteligentemente.

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

O tienes que crear una relación de muchos a muchos. O puede darle a sus Categorías una ID Binaria adicional y en su producto simplemente almacenar la combinación de Bitwise de Categorías-IDs

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


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

He usado & hace poco tiempo para validar un formulario de registro cuando estaba haciendo un ejercicio de ASP.NET C # donde el cortocircuitado && no alcanzarí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, y dehighlight todos los campos válidos y eliminar los mensajes de error de ellos.

El código que usé 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 usara && lugar de & , la instrucción btnSubmitClicked en el método btnSubmitClicked resaltaría solo el primer campo inválido, y todos los otros campos inválidos después de eso no se resaltarían y su mensaje de error no se mostraría porque el cortocircuito && se detendría verificando la condición después de encontrar un falso.

Puede haber una forma mejor de lograr lo mismo, pero encontré & me resultó útil en ese momento.