4D v16.3

Operadores de bits

Inicio

 
4D v16.3
Operadores de bits

Operadores de bits  


 

 

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 31. 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.

Ejemplo  

(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:

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

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:
sea cuidadoso 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

 
PROPIEDADES 

Producto: 4D
Tema: Operadores

 
HISTORIA 

 
ARTICLE USAGE

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