| 4D v13.4Operadores de bit | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  | 
    4D v13.4
 Operadores de bit 
         | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operaçãon | Operador | Sintaxis | Devolve | |
| AND | & | I.longo & I.longo | I.longo | |
| OR (inclusivo) | | | I.longo |I.longo | I.longo | |
| OR (exclusivo) | ^| | I.longo ^| I.longo | I.longo | |
| Left Bit Shift | << | I.longo << I.longo | I.longo | (ver nota 1) | 
| Right Bit Shift | >> | I.longo >> I.longo | I.longo | (ver nota 1) | 
| Bit Set | ?+ | I.longo ?+ I.longo | I.longo | (ver nota 2) | 
| Bit Clear | ?- | I.longo?- I.longo | I.longo | (ver nota 2) | 
| Bit Test | ?? | I.longo??I.longo | Booleano | (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 32. 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.| Operação | Descrição | 
| AND | Cada 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 Shift | O 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 Shift | O 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 Set | O 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 Clear | O 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 Test | Devolvem 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. | 
(1) A tabela a seguir dá um exemplo de cada operador de bits:
| Operação | Exemplo | Resultado | 
| Bitwise AND | 0x0000FFFF & 0xFF00FF00 | 0x0000FF00 | 
| Bitwise OR (inclusivo) | 0x0000FFFF | 0xFF00FF00 | 0xFF00FFFF | 
| Bitwise OR (exclusivo) | 0x0000FFFF ^| 0xFF00FF00 | 0xFF0000FF | 
| Left Bit Shift | 0x0000FFFF << 8 | 0x00FFFF00 | 
| Right Bit Shift | 0x0000FFFF >> 8 | 0x000000FF | 
| Bit Set | 0x00000000 ?+ 16 | 0x00010000 | 
| Bit Clear | 0x00010000 ?- 16 | 0x00000000 | 
| Bit Test | 0x00010000 ?? 16 | True | 
| 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 bitou:
 $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
	Produto: 4D
	Tema: Operadores
	
        
        
	
Operadores
Operadores de Cadeia
Operadores de Comparação
Operadores de data
Operadores de Hora
Operadores de Imagem
Operadores Lógicos
Operadores Numéricos