Operadores Bit a Bit
Visão Geral
Operadores bit a bit (também conhecidos como operadores de bit) são caracteres que representam ações (operações bit a bit) que são executadas em bits únicos. Dependendo do fornecedor do banco de dados, as operações bit a bit podem ser executadas em colunas int e byte e permitem criar uma coluna que contém vários estados de informação.
O caso de uso mais comum para operadores bit a bit é usar valores numéricos onde os bits do número são usados para conter os bits de informação:
1
:...0001
2
:...0010
4
:...0100
- ...
Operadores bitwise podem ser usados com quaisquer opções relacionadas que não sejam exclusivas (não funcionariam em uma lista suspensa) e são comumente usados para acesso/segurança (acesso de leitura/gravação).
Operadores Bit a Bit Suportados
Operador | Tipo | Descrição | Exemplo |
---|---|---|---|
& | E | Retorna apenas os bits que ambos os argumentos têm em comum | 1001 & 0011 = 0001 |
| | Ou | Retorna qualquer bit que qualquer argumento tenha | 1001 | 0011 = 1011 |
^ | Exclusivo Ou | Retorna apenas bits que somente um dos argumentos possui | 1001 ^ 0011 = 1010 |
~ | Negar | Inverte todos os bits de um único argumento | ~1001 = 0110 |
Cenário de Exemplo
Operadores bitwise podem ser usados em um cenário do tipo Schedule, onde você deseja exibir indicadores de tipo bit representando dias da semana para diferentes programações. Aqui, usaríamos lógica para obter os sinalizadores de bit compostos que representam Weekday e Weekend.
Neste cenário de exemplo, assumimos que há uma tabela Day e atribuiremos cada bit a um dia da semana:
DayID | ID em bits | Day (coluna enum) |
---|---|---|
1 | 0000001 | Domingo |
2 | 0000010 | Segunda-feira |
4 | 0000100 | Terça-feira |
8 | 0001000 | Quarta-feira |
16 | 0010000 | Quinta-feira |
32 | 0100000 | Sexta-feira |
64 | 1000000 | Sábado |
Também podemos ter registros combinados:
DayID | ID em bits | Dia (coluna enum) |
---|---|---|
62 | 0111110 | Dia da semana |
65 | 1000001 | Fim de semana |
Dada essa configuração em vigor, poderíamos usar isso para um Schedule:
Schedule | DayID | DayID em bits |
---|---|---|
Funciona às segundas-feiras | 2 | 0000010 |
Funciona às sextas-feiras | 32 | 0100000 |
Acontece na Ter e Qua | 12 | 0001100 |
Nota
Observe que não haveria FK neste cenário, pois nem todas as combinações possíveis serão descritas na tabela Day. Na realidade, a tabela Day pode nem ser necessária, mas ajuda neste cenário.
Agora podemos usar os operadores bitwise para adicionar, remover ou verificar o seguinte:
- Adiciona sexta-feira à programação:
UPDATE Schedule Set DayID = DayID | Enum(Day, 'Friday') WHERE ....
- Alterna sexta-feira da programação:
UPDATE Schedule Set DayID = DayID ^ Enum(Day, 'Friday') WHERE ....
- Verifica se funciona às sextas-feiras:
IIF(DayID & Enum(Day, 'Friday') = Enum(Day, 'Friday'), 'Runs on Fridays', 'Don't run on Fridays')
- Verifica se funciona durante todo o fim de semana:
IIF(DayID & Enum(Day, 'Weekend') = Enum(Day, 'Weekend'), 'Runs on the whole Weekend', 'Don't run on Saturday and Sunday')
- Verifica se ele roda em pelo menos um dia no fim de semana:
IIF(DayID & Enum(Day, 'Weekend') > 0, 'Runs on a weekend day', 'Don't run on any weekend day')
Exemplos de Lógica
Dependendo do seu cenário, a lógica de Schedule necessária pode ser simples ou mais complexa. Continuando com nosso exemplo de Schedule, se todas as opções de Day representam um único sinalizador, sua lógica pode ser simples. Por exemplo: S.DayId ^ D.DayId
Se você estiver usando flags de bits compostos (Weekday e Weekend), você pode precisar de uma lógica mais complexa. Por exemplo: IIF(S.DayId & D.DayId > 0, S.DayId ^ (S.DayId & D.DayId), S.DayId | D.DayId)