2009-02-05 10 views
5

मैं क्लाइंट और सर्वर अनुप्रयोगों के बीच पास करने के लिए लाइट ऑब्जेक्ट डेटा-पैकेज बनाना चाहता हूं।वस्तु स्थिति को नियंत्रित करने के लिए बिट/बिट-ऑपरेटर का उपयोग कैसे करें?

यह एक बहुत आसान काम नहीं है कि मैं केवल 1 बाइट के साथ नियंत्रित कर सकते हैं, तो एक बाइट में प्रत्येक बिट एक अलग अर्थ होगा,

केवल बिट

0 = False 
1 = True 

ITENS मैं का उपयोग करना अब जरूरत है:

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? 

समाधान

सभी मदद करने के बाद, बीमार अगले सेट

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; 

और स्ट्रीम के लिए उपयोग करें - रिकॉर्ड प्रयोग की जाने वाली> दृढ़ता, इस किया जाएगा:

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

आप लोग धन्यवाद, सभी के लिए जवाब और टिप्पणियां।

+1

सेट सीधे बिटवाई ऑपरेटरों की तुलना में एक बेहतर तकनीक है। वे कम "प्रकाश" नहीं हैं, क्योंकि सेट ऑपरेशन बाइनरी ऑपरेशंस के समान मशीन कोड पर संकलित होते हैं। लाभ यह है कि वे टाइप-सेफ हैं और कंपाइलर द्वारा चेक किए जाते हैं, जबकि बिटवाई ऑपरेशंस सभी पूर्णांक पर होते हैं। –

+1

तो यदि आपके पास अधिकतम 8 संभावित सदस्यों के साथ एक सेट है, तो आकार आकार में 1 बाइट होगा। –

+0

मैंने यहां एक संबंधित प्रश्न पूछा: "[क्या यह एकाधिक बूलियन मानों के लिए सरणी या बिट एक्सेस का उपयोग करना तेज़ है?] (Http://stackoverflow.com/questions/517138/is-it-faster-to-use-an -एरे-या-बिट-एक्सेस-फॉर-बहु-बूलियन-वैल्यू/517184 # 517184) " –

उत्तर

7

मैं वास्तव में इसके लिए एक सेट का उपयोग करता हूं। हालांकि, मुझे लगता है कि आप वास्तव में एक बाइट चाहते हैं। हर जगह सेट का प्रयोग करें और फिर अंत में एक बाइट टाइप करें।

इस समाधान के लिए बहुत कम टाइपिंग की आवश्यकता होगी, मानक डेल्फी ऑपरेटरों के लिए समर्थन है और वास्तव में बैरी केली ने इंगित किया है कि वास्तव में कोई प्रदर्शन जुर्माना नहीं है।

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; 
+0

@PEtriW, मैं इसे आज़माएं। –

+0

यह विजेता है, मुझे लगता है कि थोड़ा सा रिफ्रैक्टरी मुझे अपने मौजूदा कोड को बेहतर बनाने में मदद करेगा। –

1

This page बिटवाई ऑपरेटरों सहित डेल्फी ऑपरेटरों का वर्णन करता है।

ऐसा लगता है कि आपको और ऑपरेटर का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

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

झंडे सेट करने के लिए, आप उपयोग कर सकते हैं या:

bitFlags := LOADED_FROM_DATABASE or PERSISTED or CHANGED; 
+0

@ स्कॉट, उत्कृष्ट। धन्यवाद! –

+0

सेट डेल्फी में इसके लिए एक बेहतर आदिम हैं, क्योंकि वे भाषा के वाक्यविन्यास और अर्थशास्त्र का हिस्सा हैं, फिर भी उसी मशीन-कोड संचालन के लिए संकलित हैं। –

+0

@ बैरी, धन्यवाद। मैं सेट का उपयोग करता हूं और धारा के दौरान बाइट को कास्ट करता हूं। –

6

मैं इस के लिए एक सेट का प्रयोग करेंगे:

type 
    TMyDatum = (mdLoaded, mdPersisted, mdChanged, mdMarkedToDelete, ...); 
    TMyData = set of TMyDatum; 

var 
    Foo: TMyData; 
begin 
    Foo := [mdLoaded, mdChanged]; 
    if (mdPersisted in Foo) then ... 

ये पूर्णांक के रूप में लागू किया जाता है, तो आप उन्हें आसानी से पारित कर सकते हैं। और मुझे बिटवाई ऑपरेटरों की तुलना में कोड बहुत अधिक पठनीय लगता है।

+0

@ क्रेग, यह आज मेरे पास है। जैसा कि मैंने अपने प्रश्न में इंगित किया है, यह अधिक हल्का होना चाहिए, और मैं एक गणित प्रकार के आकार के बारे में निश्चित नहीं हूं। 1 बाइट स्ट्रीम करने के लिए, स्ट्रीम समेकित प्रकारों की तुलना में अधिक आसान है। बिट मानों का परीक्षण करने के लिए कोड एक टीस्टैटस ऑब्जेक्ट के अंदर एम्बेडेड किया जाएगा, जैसे स्टेटस। आईएसलोडेड –

+1

सीज़र - एक सेट का आकार 1, 2, 3, 4 इत्यादि बाइट्स है, हालांकि आवश्यक सभी बिट्स में फ़िट होने के लिए कई आवश्यक हैं, सेट के एक संभावित प्रति सदस्य एक बिट। सेट सीधे बिटवाई बाइनरी ऑपरेशंस के बराबर हैं। –

+0

सीज़र: तब तोड़ा नहीं जाता है। इसे "ठीक" मत करो! –

संबंधित मुद्दे

 संबंधित मुद्दे