Ir para o conteúdo

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.

bitwiseexample.png

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)