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.
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)