traduccion operator operadores manejo ejemplos desplazamiento bitwise delphi bitwise-operators object-state

delphi - operator - manejo de bits en c ejemplos



¿Cómo usar bit/bit-operator para controlar el estado del objeto? (3)

Realmente usaría un set para esto. Sin embargo, veo que realmente quieres un byte. Use conjuntos en todas partes, luego encasille en un byte al final.

Esta solución requerirá mucho menos tipeo, tiene soporte para operadores delphi estándar y realmente no conlleva ninguna penalización de rendimiento como ha señalado Barry Kelly.

procedure Test; type TSetValues = ( TSetValue1 = 0, TSetValue2 = 1, TSetValue4 = 2, TSetValue8 = 3, TSetValue16 = 4, TSetValue32 = 5, TSetValue64 = 6, TSetValue128 = 7 ); TMySet = set of TSetValues; var myValue: byte; mySet: TMySet; begin mySet := [TSetValue2, TSetValue16, TSetValue128]; myValue := byte(mySet); ShowMessage(IntToStr(myValue)); // <-- shows 146 end;

Quiero crear paquetes de datos de objeto ligero para pasar entre aplicaciones de cliente y servidor.

Es una tarea tan simple, que puedo controlar con solo 1 byte, por lo que cada bit en un byte tendrá un significado diferente,

Usando solo el bit

0 = False 1 = True

Itens necesito ahora:

1 - Loaded from database 2 - Persisted 3 - Changed 4 - Marked to Delete 5 - 6 - 7 - Null Value 8 - Read Only 1) How do I use bit operators in Delphi to check each bit value? 2) How do I set the bit Values?

Solución

Después de toda la ayuda, utilizaré el siguiente Set

TStateType = ( stLoaded = 0, // loaded from persistance stNative = 2, // value loaded and converted to native type stPersisted = 3, // saved stChanged = 4, // object or member changed stToDelete = 5, // marked to delete stReadOnly = 6, // read only object, will not allow changes stNull = 7 // value is null ); TState = Set of TStateType;

Y para transmisión -> persistencia, este será el registro que se utilizará:

TDataPackage = record Data: TBytes; TypeInfo: TMetaInfo; State: Byte; Instance: TBuffer; end;

Gracias chicos, por todas las respuestas y comentarios.


Yo usaría un set para esto:

type TMyDatum = (mdLoaded, mdPersisted, mdChanged, mdMarkedToDelete, ...); TMyData = set of TMyDatum; var Foo: TMyData; begin Foo := [mdLoaded, mdChanged]; if (mdPersisted in Foo) then ...

Estos se implementan como enteros, por lo que puede pasarlos fácilmente. Y creo que el código es mucho más legible que los operadores bit a bit.


Esta página describe los operadores de Delphi, incluidos los operadores bit a bit.

Parece que necesita usar el operador y. Por ejemplo:

const LOADED_FROM_DATABASE = 1; PERSISTED = 2; CHANGED = 4; // etc... //... if (bitFlags and LOADED_FROM_DATABASE) <> 0 then begin // handle LOADED FROM DATABASE end; if (bitFlags and PERSISTED) <> 0 then begin // handle PERSISTED end; // etc...

Para establecer las banderas, puede usar OR:

bitFlags := LOADED_FROM_DATABASE or PERSISTED or CHANGED;