Operadores de bits

4D - Documentation   Français   English   German   Español   English   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente

versión 6.0


Los operadores de bits se aplican a expresiones o valores de tipo Entero largo.

Nota: Si pasa un valor de tipo Entero o Numérico a un operador de bits, 4D lo convierte en Entero largo antes de calcular la expresión que utiliza el operador de bits.

Cuando utilice operadores de bits, debe considerar un valor de tipo Entero largo como un array de 32 bits. Los bits se numeran de 0 a 31, de derecha a izquierda.

Como cada bit puede valer 0 o 1, usted puede igualmente considerar un valor de tipo Entero largo como una expresión donde puede almacenar 32 valores de tipo Booleano. Cuando el bit vale 1, el valor es True y cuando vale 0, el valor es False.

Una expresión que utiliza un operador de bits devuelve un valor de tipo Entero largo, excepto para el operador Bit Test, donde la expresión devuelve un valor Booleano. La siguiente tabla lista los operadores de bits y su sintaxis:

OperaciónOperadorSintaxisDevuelve
AND&E.largo & E.largoE.largo
OR (inclusivo)|E.largo | E.largoE.largo
OR (exclusivo)^|E.largo ^| E.largoE.largo
Left Bit Shift<<E.largo << E.largoE.largo(ver nota 1)
Right Bit Shift>>E.largo >> E.largoE.largo(ver nota 1)
Bit Set?+E.largo ?+ E.largoE.largo(ver nota 2)
Bit Clear?-E.largo?- E.largoE.largo(ver nota 2)
Bit Test??E.largo?? E.largoBooleano(ver nota 2)

Notas

(1) En las operaciones utilizando Left Bit Shift y Right Bit Shift, el segundo operando indica el número de posiciones de bits que el primer operando se moverá en el valor resultante. Por lo tanto, este segundo operando debe estar entre 0 y 32. Note sin embargo, que mover 0 devuelve un valor sin cambio y mover más de 31 bits devuelve 0x00000000 porque todos los bits se pierden. Si pasa otro valor como segundo operando, el resultado no es significativo.

(2) En las operaciones utilizando Bit Set, Bit Clear y Bit Test, el segundo operando indica el número del bit en el cual actual. Por lo tanto, este segundo operando debe estar entre 0 y 31. De lo contrario, la expresión devuelve el valor del primer operando sin cambiar el valor por Bit Set y Bit Clear, y devuelve False para Bit Test.

La siguiente tabla lista los operadores de bits y sus efectos:

OperaciónDescripción
ANDCada bit devuelto es el resultado de la operación AND lógica aplicada a
los dos operandos.
Esta es la tabla de AND lógica:
1 & 1 --> 1
0 & 1 --> 0
1 & 0 --> 0
0 & 0 --> 0
En otras palabras, el bit resultante es 1 si los dos bits operandos valen 1;
de lo contrario el bit resultante es 0.
OR (inclusivo)Cada bit resultante es el resultado de la operación OR inclusivo lógico
aplicado a los bits en los dos operandos.
Esta es la tabla del OR inclusivo lógico:
1 | 1 --> 1
0 | 1 --> 1
1 | 0 --> 1
0 | 0 --> 0
En otras palabras, el bit resultante es 1 si al menos uno de los dos bits
operandos es 1; de lo contrario el bit resultante es 0.
O (exclusivo)Cada bit devuelto es el resultado de la operación XOR exclusivo lógico
aplicado a los dos bits operandos.
Esta es la tabla del XOR exclusivo lógico:
1 ^| 1 --> 0
0 ^| 1 --> 1
1 ^| 0 --> 1
0 ^| 0 --> 0
En otras palabras, el bit resultante es 1 si sólo uno de los dos bits
operandos es 1; de lo contrario el bit resultante es 0.
Left Bit ShiftEl valor devuelto es definido para el valor del primer operando, luego los
bits resultantes se mueven a la izquierda el número de posiciones
indicadas por el segundo operando. Los bits a la izquierda se pierden y
los nuevos bits a la derecha toman el valor 0.
Nota: Teniendo en cuenta sólo los valores positivos, moviendo a la
izquierda N bits es lo mismo que multiplicar por 2^N.
Right Bit ShiftEl valor resultante se asigna al primer operando, luego los bits
resultantes se mueven a la derecha el número de posición indicada por el
segundo operando. Los bits a la derecha se pierden y los nuevos bits a la
izquierda toman el valor 0.
Nota: Teniendo en cuenta sólo los valores positivos, mover a la derecha N
bits es lo mismo que dividir por 2^N.
Bit SetEl valor resultante es definido por el primer valor de operando, luego el
bit resultante, cuyo número se indica por el segundo operando, toma el
valor 1.
Los otros bits no cambian.
Bit ClearEl valor devuelto es definido para el valor del primer operando, luego el
bit resultante, cuyo número es indicado por el segundo operando, toma
el valor 0.
Los otros bits no cambian.
Bit TestDevuelve True si, en el primer operando, el bit cuyo número
es indicado por el segundo operando es igual a 1.
Devuelve Falso si, en el primer operando, el bit cuyo número se indica
por el segundo operando es igual a 0.

Ejemplos

(1) La siguiente tabla da un ejemplo de cada operador de bits:


OperaciónEjemploResultado
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 ofrece muchas constantes predefinidas. Los nombres de algunas de estas constantes comienzan por "bit" o "mask." Por ejemplo, este es el caso de las constantes del tema Propiedades de los recursos:


ConstanteTipoValor
System heap resource maskEntero largo64
System heap resource bitEntero largo6
Purgeable resource maskEntero largo32
Purgeable resource bitEntero largo5
Locked resource maskEntero largo16
Locked resource bitEntero largo4
Protected resource maskEntero largo8
Protected resource bitEntero largo3
Preloaded resource maskEntero largo4
Preloaded resource bitEntero largo2
Changed resource maskEntero largo2
Changed resource bitEntero largo1


Estas constantes permiten probar el valor devuelto por Get resource properties o crear el valor a pasar a SET RESOURCE PROPERTIES. Las constantes cuyo nombre termina en "bit" dan la posición del bit que quiere probar, borrar, o definir. Las constantes cuyo nombre termina en "mask" dan un valor de tipo Entero largo donde sólo el bit (que quiere probar, borrar o asignar) es igual a uno.

Por ejemplo, para probar si un recurso (cuyas propiedades han sido almacenadas en la variable $vlResAttr) es purgable o no, puede escribir:

   If ($vlResAttr ?? Purgeable resource bit) ` ¿El recurso es purgable?

o:

   If (($vlResAttr & Purgeable resource mask) # 0) ¿El recurso es purgable?

Al contrario, puede utilizar estas constantes para definir el mismo bit. Puede escribir:

   $vlResAttr:=$vlResAttr ?+ Purgeable resource bit

o:

   $vlResAttr:=$vlResAttr | Purgeable resource bit

(3)Este ejemplo almacena dos valores Enteros en un valor Entero largo. Puede escribir:

   $vlLong:=($viIntA<<16) | $viIntB ` Almacenar dos Enteros en un Entero largo

   $vlIntA:=$vlLong>>16 ` Extraer el entero almacenado en high-word

   $viIntB:=$vlLong & 0xFFFF ` Extraer el entero almacenado en low-word

Consejo: Tenga cuidado al manipular valores de tipo Entero largo o Entero con expresiones que combinan operadores numéricos y bitwise. El bit superior (bit 31 para Entero largo, bit 15 para Entero) define el signo del valor—positivo si es cero, negativo si es 1. Los operadores numéricos utilizan este bit para detectar el signo de un valor, pero los operadores de bits no tienen en cuenta el significado de este bit.

Ver también

Operadores, Operadores de cadenas, Operadores de comparación, Operadores de fechas, Operadores de horas, Operadores de imágenes, Operadores lógicos, Operadores numéricos.


4D - Documentation   Français   English   German   Español   English   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente