Además de usar el desplazamiento de bits y cosas así para la aritmética como sugiere Lucas Sampaio, la manipulación de bits es muy eficiente para almacenar “matrices” de propiedades booleanas. Si desea poder comprobar rápidamente si las propiedades de un objeto coinciden con algún conjunto de propiedades, puede utilizar el enmascaramiento de bits para ello. Vea este ejemplo trivial, escrito en Python:
# banderas de vehículos
VFLAG_FAST = 1
VFLAG_LUXURY = 2
VFLAG_CAR = 4
VFLAG_BIKE = 8
VFLAG_SAFE = 16
VFLAG_TRANSPORT = 32
VFLAG_ECONOMY = 64
VFLAG_ELECTRIC = 128
Vehículo de clase:
def __init __ (self, name, flags):
self.name = name
self.flags = flags
- En el algoritmo EM, ¿debería aumentar el valor de la función objetivo a través de cada M-STEP?
- ¿Cuáles son las estrategias más populares utilizadas en el comercio de alta frecuencia?
- ¿Podemos encontrar si la matriz no contiene un elemento mayoritario en un tiempo casi constante?
- ¿Qué es más rápido, encontrar un elemento en una tabla hash o en una lista ordenada? ¿Suena fácil? Pensar, repensar y comentar.
- Cómo comenzar a crear un modelo / pronóstico de ventas con dos años y medio de datos de ventas anteriores
VEHÍCULOS = [
Vehículo (“Tesla”, VFLAG_FAST | VFLAG_CAR | VFLAG_ELECTRIC | VFLAG_SAFE),
Vehículo (“Yamaha”, VFLAG_FAST | VFLAG_BIKE),
Vehículo (“WV Transporter”, VFLAG_CAR | VFLAG_TRANSPORT),
Vehículo (“Ciclomotor”, VFLAG_BIKE | VFLAG_TRANSPORT | VFLAG_ECONOMY)
]
banderas = VFLAG_TRANSPORT | VFLAG_ECONOMY
para vehículo en filtro (lambda v: v.flags & flags == flags, VEHICLES):
imprimir vehículo.nombre
# “Ciclomotor”
Cada VFLAG_ * es una potencia de dos enteros, comenzando en 1, porque todos corresponden a un solo bit que se establece. Al crear un nuevo vehículo, usamos la manipulación de bits para establecer las banderas en ese vehículo, con el | operador siendo un bit a bit o . Eso significa que el número de salida tendrá unos en todos los lugares donde cualquiera de los números de entrada tiene unos:
a = 0b0001
b = 0b0100
papelera de impresión (a | b)
>>> 0b0101
Al buscar un vehículo que coincida con algunos criterios, aplicamos el operador &, que es el bit y. El resultado son unos en todos los lugares donde ambas entradas tienen unos:
a = 0b0001
b = 0b0111
Papelera de impresión (a & b)
>>> 0b0001
Esto permite comparaciones excepcionalmente rápidas, especialmente al escribir código en C o C ++ o lo que sea, ya que los operadores lógicos bit a bit son una sola instrucción y el almacenamiento de las banderas es muy compacto (un solo entero). La desventaja es que está limitado por el tamaño de un número entero en su sistema, generalmente de 32 o 64 bits. Eso significa que sus vehículos no pueden tener más de 32 (o 64) tipos diferentes de propiedades. Dependiendo de lo que esté haciendo, esto puede o no ser un problema.