Configuração de Registradores
De modo geral, uma configuração pode envolver a manipulação de apenas um bit ou de um conjunto de bits. A seguir serão demonstradas algumas situações envolvendo registradores de 8 bits.
Estabelecendo uns
Deseja-se configurar o registrador de modo que o bit 5 tenha o valor 1. Sem considerar os efeitos que um valor atribuído ao registrador pode causar, tal procedimento poderia ser executado da seguinte maneira:
REGISTRADOR = 32;
Valor 32? Nesse caso, 32 (2^5) é o mesmo que 100000 em binário. Isto é, somente o bit 5 está ativado. Outra maneira de realizar a mesma configuração é a seguinte.
REGISTRADOR = (1 << 5);
Pois, o valor 1 (decimal) representado no formato binário é 00000001. Agora, considere o valor 1 deslocado (<<) 5 vezes para a esquerda. Tal procedimento é chamado de máscara.
A cada deslocamento:
O bit mais a esquerda é descartado.
O bit menos significativo é zero.
REGISTRADOR = (1 << 5);
00000001; valor atual
00000010; valor deslocado uma vez para esquerda
00000100; 2x
00001000; 3x
00010000; ...
00100000;
Problemas com o método anterior
De fato, o bit 5 teve o valor configurado no exemplo anterior. No entanto, a atribuição do valor 32 ou (1 << 5) estabeleceu todos os bits com valor zero, com exceção do bit 5. Nesse ponto, é importante lembrar que um registrador mantém uma determinada configuração e qualquer modificação implica em uma nova configuração.
Assim, tais operações devem manipular somente os bits necessários. Isto é, deve-se manter a configuração anterior e modificar somente o necessário. O cenário agora é o seguinte: o valor que será atribuído corresponde ao valor do próprio registrador mais o da modificação desejada.
REGISTRADOR = REGISTRADOR
OPERADOR
MÁSCARA;
Qual operador deve ser utilizado? O operador lógico OR (símbolo | na linguagem C).
REGISTRADOR = REGISTRADOR | (1 << 5);
Tal operação é realizada bit a bit entre os dois valores. O resultado da operação OR será zero somente se os dois bits foram iguais a zero. Considere que o registrador está com o valor 3. O resultado dessa operação é o seguinte:
REGISTRADOR
00000011
MÁSCARA
00100000
Resultado:
00100011
Observe que o resultado consiste dos bits que estavam em 1 (valor anterior) mais os bits ativados da máscara. Em outras palavras, são modificados apenas os bits que estão em um na máscara.
Estabelecendo zeros
Da mesma maneira, o procedimento de manipulação de bits pode ser utilizado para colocar em zero um conjunto de bits. Basicamente, esse procedimento é o oposto do demonstrado anteriormente e utiliza os operadores NOT e AND.
Considere que o registrador está com o valor 35 (00100011, resultado do exemplo anterior). Utilizaremos o complemento (NOT) da máscara corresponde ao bit que será posto em zero. Nesse caso, deseja-se colocar em zero o bit 5. O resultado é dado pela operação AND que resulta em zero sempre que um dos bits é zero.
REGISTRADOR
00100011
NOT(MÁSCARA)
11011111
Resultado:
00000011
O complemento da máscara estabelece todos os bits em 1, exceto aqueles que serão manipulados. Com a operação AND, somente esses bits em zero alterarão o valor do registrador.
Na linguagem C, os operadores NOT e AND são representados pelos símbolos ~ e &.
REGISTRADOR = REGISTRADOR & ~(1 << 5);
Comutação de nível lógico
Para inverter o estado de um bit utiliza-se o operador XOR. Na linguagem C, o operador XOR é representado pelo símbolo ^. Tal operação resulta em zero sempre os bits envolvidos tem o mesmo valor. Assim, são modificados apenas os bits que estão em um na máscara.
REGISTRADOR = REGISTRADOR | (1 << 5)
00100011
REGISTRADOR = REGISTRADOR ^ (1 << 5)
00000011
REGISTRADOR = REGISTRADOR ^ (1 << 5)
00100011
REGISTRADOR = REGISTRADOR ^ (1 << 5)
00000011
Last updated