Saltar al contenido

Operadores Bit a Bit

Descripción General

Como novedad en Vinyl 3.3, ahora se admiten operadores bit a bit (también conocidos como operadores de bits). Los operadores bit a bit son caracteres que representan acciones (operaciones bit a bit) que se realizan en bits individuales. Dependiendo del proveedor de la base de datos, las operaciones bit a bit se pueden realizar en columnas int y byte y permiten crear una columna que contiene múltiples estados de información.

El caso de uso más común de los operadores bit a bit es utilizar valores numéricos donde los bits del número se utilizan para contener los bits de información:

  • 1: ...0001
  • 2: ...0010
  • 4: ...0100 -...

Los operadores bit a bit se pueden usar con cualquier opción relacionada que no sea exclusiva (no funcionarían en una lista desplegable) y se usan comúnmente para acceso/seguridad (acceso de lectura/escritura).

Operadores Bit a Bit Admitidos

Operador Tipo Descripción Ejemplo
& Y Devuelve sólo los bits que ambos argumentos tienen en común 1001 y 0011 = 0001
| O Devuelve cualquier bit que tenga cualquiera de los argumentos 1001 | 0011 = 1011
^ Exclusivo O Devuelve sólo bits que sólo tiene uno de los argumentos 1001 ^ 0011 = 1010
~ Negar Invierte todos los bits de un único argumento ~1001 = 0110

Escenario de Ejemplo

Los operadores bit a bit se pueden utilizar en un escenario de tipo Horario, donde desea mostrar indicadores de tipo bit que representan los días de la semana para diferentes horarios. Aquí usaríamos la lógica para obtener los indicadores de bits compuestos que representan el día de la semana y el fin de semana.

ejemplo bit a bit.png

En este escenario de ejemplo, asumimos que hay una tabla de Día y asignaremos cada bit a un día de la semana:

ID de día Identificación en bits Día (columna de enumeración)
1 0000001 domingo
2 0000010 lunes
4 0000100 Martes
8 0001000 miércoles
16 0010000 jueves
32 0100000 viernes
64 1000000 Sábado

También podemos tener registros combinados:

ID de día Identificación en bits Día (columna de enumeración)
62 0111110 Día laborable
65 1000001 Fin de semana

Dada esta configuración implementada, podríamos usar esto para un Horario:

Horario ID de día ID de día en bits
Funciona los lunes 2 0000010
Funciona los viernes 32 0100000
Funciona los martes y miércoles 12 0001100

Nota

Tenga en cuenta que no habría FK en este escenario, ya que no todas las combinaciones posibles se describirán en la tabla de Días. En realidad, es posible que la tabla Día ni siquiera sea necesaria, pero ayuda en este escenario.

Ahora podemos usar los operadores bit a bit para agregar, eliminar o verificar lo siguiente:

  • Agrega el viernes al horario: UPDATE Schedule Set DayID = DayID | Enum(Day, 'Friday') WHERE ....
  • Alterna el viernes desde el horario: UPDATE Schedule Set DayID = DayID ^ Enum(Day, 'Friday') WHERE ....
  • Comprueba si funciona los viernes: IIF(DayID & Enum(Day, 'Friday') = Enum(Day, 'Friday'), 'Runs on Fridays', 'Don't run on Fridays')
  • Comprueba si funciona durante todo el fin de semana: IIF(DayID & Enum(Day, 'Weekend') = Enum(Day, 'Weekend'), 'Runs on the whole Weekend', 'Don't run on Saturday and Sunday')
  • Comprueba si se ejecuta al menos un día del fin de semana: IIF(DayID & Enum(Day, 'Weekend') > 0, 'Runs on a weekend day', 'Don't run on any weekend day')

Ejemplos de Lógica

Dependiendo de su escenario, la lógica de programación requerida puede ser simple o más compleja. Continuando con nuestro ejemplo de Programación, si todas las opciones de Día representan una sola bandera, su lógica puede ser simple. Por ejemplo: S.DayId ^ D.DayId

Si utiliza indicadores de bits compuestos (día laborable y fin de semana), es posible que necesite una lógica más compleja. Por ejemplo: IIF(S.DayId & D.DayId > 0, S.DayId ^ (S.DayId & D.DayId), S.DayId | D.DayId)