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;