4D v16.3

Operadores de bit

Página Inicial

 
4D v16.3
Operadores de bit

Operadores de bit  


 

 

Os operadores de bits são aplicados a expressões ou valores de tipo Inteiro longo.

Nota: se passa um valor de tipo Inteiro ou Numérico a um operador de bits, 4D ou converte em Inteiro longo antes de calcular a expressão que utiliza o operador de bits.

Quando utilize operadores de bits, deve considerar um valor de tipo Inteiro longo como um array de 32 bits. Os bits são numerados de 0 a 31, de direita para a esquerda.

Como cada bit pode valer 0 ou 1, você pode igualmente considerar um valor de tipo Inteiro longo como uma expressão onde pode armazenar 32 valores de tipo Booleano. Quando o bit vale 1, o valor é True  quando vale 0, o valor é False.

Uma expressão que utiliza um operador de bits devolve um valor de tipo Inteiro longo, exceto para o operador Bit Test, onde a expressão devolve um valor Booleano. A seguinte tabela lista os operadores de bits e sua sintaxe:

OperaçãonOperadorSintaxisDevolve
AND&I.longo & I.longoI.longo
OR (inclusivo)|I.longo |I.longoI.longo
OR (exclusivo)^|I.longo ^| I.longoI.longo
Left Bit Shift<<I.longo << I.longoI.longo(ver nota 1)
Right Bit Shift>>I.longo >> I.longoI.longo(ver nota 1)
Bit Set?+I.longo ?+ I.longoI.longo(ver nota 2)
Bit Clear?-I.longo?- I.longoI.longo(ver nota 2)
Bit Test??I.longo??I.longoBooleano(ver nota 2)

Notas

(1) Nas operações utilizando Left Bit Shift e Right Bit Shift, o segundo operando indica o número de posições de bits que o primeiro operando se moverá no valor resultante. Portanto, este segundo operando deve estar entre 0 e 31. Note entretanto, que mover 0 devolve um valor sem mudança e mover mais de 31 bits devolve 0x00000000 porque todos os bits se perdem. Se passa outro valor como segundo operando, o resultado não é significativo.
(2) Nas operações utilizando Bit Set, Bit Clear e Bit Test, o segundo operando indica o número do bit na qual atual. Portanto, este segundo operando deve estar entre 0 e 31. Do contrário, a expressão devolve o valor do primeiro operando sem mudar o valor por Bit Set e Bit Clear, e retorna False para Bit Test.

A seguinte tabela lista os operadores de bits e seus efeitos:

OperaçãoDescrição
ANDCada bit devolvido é o resultado da operação AND lógica aplicada aos dois operandos. Esta é a tabela de AND lógica:
1 & 1 --> 1
0 & 1 --> 0
1 & 0 --> 0
0 & 0 --> 0
Em outras palavras, o bit resultante é 1 se os dois bits operandos valem 1; do contrário o bit resultante é 0.
OR (inclusive)Cada bit resultante é o resultado da operação OR inclusive lógico aplicado aos bits nos dois operandos. Esta é a tabela do OR inclusive lógico:
1 | 1 --> 1
0 | 1 --> 1
1 | 0 --> 1
0 | 0 --> 0
Em outras palavras, o bit resultante é 1 se ao menos um dos dois bits operandos é 1; do contrário o bit resultante é 0.
O (exclusivo)Cada bit devolvido é o resultado da operação. Em outras palavras XOR exclusivo lógico aplicado aos dois bits operandos. Esta é a tabela do XOR exclusivo lógico:
1 ^| 1 --> 0
0 ^| 1 --> 1
1 ^| 0 --> 1
0 ^| 0 --> 0
Em outras palavras, o bit resultante é 1 se só um dos dois bits operandos é 1; do contrário o bit resultante é 0.
Left Bit ShiftO valor devolvido é definido para o valor do primeiro operando, logo os bits resultantes se movem a esquerda o número de posições indicadas pelo segundo operando. Os bits à esquerda se perdem e os novos bits a direita tomam o valor 0.
Nota: considerando os valores positivos, movendo à esquerda N bits é o mesmo que multiplicar por 2^N.
Right Bit ShiftO valor resultante se atribui ao primeiro operando, logo os bits resultantes são movidos a direita o número de posição indicada pelo segundo operando. Os bits a direita são perdidos e os novos bits a esquerda tomam o valor 0.
Nota: considerando só os valores positivos, mover a direita N bits é o mesmo que dividir por 2^N.
Bit SetO valor resultante é definido pelo primeiro valor de operando, logo o bit resultante, cujo número se indica pelo segundo operando, toma o valor 1. Os outros bits não mudam.
Bit ClearO valor devolvido é definido para o valor do primeiro operando, logo o bit resultante, cujo número é indicado pelo segundo operando, toma o valor 0. Os outros bits não mudam.
Bit TestDevolvem True se, no primeiro operando, o bit cujo número é indicado pelo segundo operando for igual a 1. Devolve Falso se, no primeiro operando, o bit cujo número se indica pelo segundo operando for igual a 0.

Exemplo  

(1) A tabela a seguir dá um exemplo de cada operador de bits:

OperaçãoExemploResultado
Bitwise AND0x0000FFFF & 0xFF00FF000x0000FF00
Bitwise OR (inclusivo)0x0000FFFF | 0xFF00FF000xFF00FFFF
Bitwise OR (exclusivo)0x0000FFFF ^| 0xFF00FF000xFF0000FF
Left Bit Shift0x0000FFFF << 80x00FFFF00
Right Bit Shift0x0000FFFF >> 80x000000FF
Bit Set0x00000000 ?+ 160x00010000
Bit Clear0x00010000 ?- 160x00000000
Bit Test0x00010000 ?? 16True


(2) 4D oferece muitas constantes pré-definidas. Os nomes de algumas destas constantes começam por “bit” ou “mask.” Por exemplo, este é o caso das constantes do tema :

Constante Tipo Valor
Changed resource bit Inteiro longo 1
Preloaded resource bit Inteiro longo 2
Changed resource mask Inteiro longo 2
Protected resource bit Inteiro longo 3
Locked resource bit Inteiro longo 4
Preloaded resource mask Inteiro longo 4
Purgeable resource bit Inteiro longo 5
System heap resource bit Inteiro longo 6
Protected resource mask Inteiro longo 8
Locked resource mask Inteiro longo 16
Purgeable resource mask Inteiro longo 32
System heap resource mask Inteiro longo 64

Estas constantes permitem provar o valor devolvido por Get resource properties ou criar o valor a passar a SET RESOURCE PROPERTIES. As constantes cujo nome termina em “bit” dão a posição do bit que quer provar, apagar, ou definir. As constantes cujo nome termina em “mask” dão um valor de tipo Inteiro longo onde só o bit (que quer provar, apagar ou asignar) é igual a um.

Por exemplo, para provar se um recurso (cujas propriedades foram armazenadas na variável $vlResAttr) são purgáveis ou não, pode escrever:

 If($vlResAttr ?? Purgeable resource bit) ` O recurso é purgável?

ou:

 If(($vlResAttr  & Purgeable resource mask)#0)O recurso é purgável?

Ao contrário, pode utilizar estas constantes para definir o mesmo bit. Pode escrever:

 $vlResAttr:=$vlResAttr ?+Purgeable resource bit

ou:

 $vlResAttr:=$vlResAttr |Purgeable resource bit

(3) Este exemplo armazena dois valores Inteiros em um valor Inteiro longo. Pode escrever:

 $vlLong:=($viIntA<<16)|$viIntB  ` Armazenar dois Inteiros em um Inteiro longo
 
 $vlIntA:=$vlLong>>16 ` Extrair o inteiro armazenado em high-word
 
 $viIntB:=$vlLong  & 0xFFFF ` Extrair o inteiro armazenado em low-word


Dica:
seja cuidadoso ao manipular valores de tipo Inteiro longo ou Entero com expressões que combinam operadores numéricos e bitwise. O bit superior (bit 31 para Inteiro longo, bit 15 para Inteiro) define o sinal do valor, positivo se for zero, negativo se for 1. Os operadores numéricos utilizam este bit para detectar o signo de um valor, mas os operadores de bits não consideram o significado de este bit.



Ver também 

Operadores
Operadores de Cadeia
Operadores de Comparação
Operadores de data
Operadores de Hora
Operadores de Imagem
Operadores Lógicos
Operadores Numéricos

 
PROPRIEDADES 

Produto: 4D
Tema: Operadores

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)