2009-02-13 15 views
10

this वेबसाइट के अनुसार, मैं 16 बिट पूर्णांक की 2 आयामी सरणी के साथ एक भूलभुलैया का प्रतिनिधित्व करना चाहता हूं।सी ++ में आप बिटवाई झंडे का उपयोग कैसे करते हैं?

प्रत्येक 16 बिट पूर्णांक निम्न जानकारी धारण करने के लिए की जरूरत है:

यहाँ एक तरह से यह करने के लिए (यह कोई एक ही रास्ता भी तरह से) है: एक 12x16 भूलभुलैया ग्रिड के रूप में एक सरणी मीटर [दर्शाया जा सकता है 16] [12] 16-बिट पूर्णांक के। प्रत्येक सरणी तत्व होगा ग्रिड में केवल एक प्रासंगिक सेल के लिए सभी जानकारी, इस तरह मैप किया पूर्णांक बिट्स के साथ शामिल हैं:

alt text http://www.mazeworks.com/mazegen/mazetut/tut5.gif

एक दीवार नीचे दस्तक, एक सीमा निर्धारित करते हैं, या एक विशेष मार्ग बनाने के लिए, हमें बस एक या दो सरणी तत्वों में बिट्स को फ़्लिप करना है।

मैं 16 बिट पूर्णांक पर बिटवाई झंडे का उपयोग कैसे करूं ताकि मैं उन बिट्स में से प्रत्येक को सेट कर सकूं और जांच कर सकूं कि वे सेट हैं या नहीं।

मैं इसे आसानी से पठनीय तरीके से करना चाहता हूं (यानी, सीमा।, सीमा.ई, दीवारें, आदि)।

यह आमतौर पर सी ++ में कैसे किया जाता है? क्या मैं प्रत्येक का प्रतिनिधित्व करने के लिए हेक्साइडसिमल का उपयोग करता हूं (यानी, Walls.N = 0x02, Walls.E = 0x04, आदि)? क्या मुझे एक enum का उपयोग करना चाहिए?


How do you set, clear, and toggle a single bit? भी देखें।

उत्तर

1

आप इसे सुझाए गए हेक्साडेसिमल झंडे या enums के साथ कर सकते हैं, लेकिन सबसे अधिक पठनीय/स्वयं-दस्तावेज शायद "बिटफील्ड" कहलाता है (विवरण के लिए, C++ bitfields के लिए Google)।

3

हेक्स स्थिरांक/enums और bitwise संचालन का उपयोग करें यदि आप परवाह करते हैं कि कौन से विशेष बिट्स का मतलब है।

अन्यथा, सी ++ बिटफील्ड का उपयोग करें (लेकिन ध्यान रखें कि पूर्णांक में बिट्स का क्रम संकलक-निर्भर होगा)।

1

हां एक अच्छा तरीका है बिट पैटर्न का प्रतिनिधित्व करने के लिए हेक्स दशमलव का उपयोग करना। फिर आप अपने 16-बिट इनट्स में हेरफेर करने के लिए बिटवाई ऑपरेटरों का उपयोग करते हैं।

उदाहरण के लिए:

if(x & 0x01){} // tests if bit 0 is set using bitwise AND 
x ^= 0x02;  // toggles bit 1 (0 based) using bitwise XOR 
x |= 0x10;  // sets bit 4 (0 based) using bitwise OR 
2

अपने बिटवाइज़ opertors जानें: &, |, ^, और!।

सी/सी ++ फ़ाइलों के शीर्ष पर मैंने प्रत्येक बिट को मुखौटा करने के लिए हेक्स में परिभाषित झंडे को देखा है।

#define ONE 0x0001 

अगर थोड़ा चालू होता है, आप और यह 1. साथ इसके साथ 1.

9

चालू करने के लिए, आप या यह 1. के साथ एक स्विच की तरह टॉगल करने के लिए, XOR यह देखने के लिए आप तो बिटफील्ड का उपयोग करना चाहते हैं तो यह एक आसान तरीका है:

typedef struct MAZENODE 
{ 
    bool backtrack_north:1; 
    bool backtrack_south:1; 
    bool backtrack_east:1; 
    bool backtrack_west:1; 
    bool solution_north:1; 
    bool solution_south:1; 
    bool solution_east:1; 
    bool solution_west:1; 
    bool maze_north:1; 
    bool maze_south:1; 
    bool maze_east:1; 
    bool maze_west:1; 
    bool walls_north:1; 
    bool walls_south:1; 
    bool walls_east:1; 
    bool walls_west:1; 
}; 

तब आपका कोड प्रत्येक को सही या गलत के लिए जांच सकता है।

+0

दुर्भाग्य से यह पोर्टेबल नहीं है क्योंकि बिट्स का क्रम संकलक विशिष्ट है। –

+0

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

+0

हां बूल बिटफील्ड के लिए समर्थित है, लेकिन आप सही हैं, उनका ऑर्डरिंग पूरी तरह से कंपाइलर तक है और आम तौर पर एंडियनस – KPexEA

2

बिट्स के सेट में हेरफेर करने के लिए, आप भी उपयोग कर सकते हैं ....

std::bitset<N>

std::bitset<4*4> bits; 
bits[ 10 ] = false; 
bits.set(10); 
bits.flip(); 
assert(!bits.test(10)); 
0

मैं bitset का बहुत बड़ा प्रशंसक नहीं हूँ। यह मेरी राय में बस और अधिक टाइपिंग है। और यह वैसे भी छिपाता नहीं है जो आप वैसे भी कर रहे हैं। आपको अभी भी & & & है। बिट्स। जब तक आप केवल 1 बिट पर नहीं चुन रहे हैं। यह झंडे के छोटे समूहों के लिए काम कर सकता है। ऐसा नहीं है कि हमें छिपाने की जरूरत है कि हम क्या कर रहे हैं। लेकिन कक्षा के इरादे आमतौर पर इसके उपयोगकर्ताओं के लिए कुछ आसान बनाने के लिए होता है। मुझे नहीं लगता कि यह वर्ग इसे पूरा करता है।

उदाहरण के लिए कहें, आपके पास फ्लैग सिस्टम है .. 64 झंडे। यदि आप परीक्षण करना चाहते हैं .. मुझे नहीं पता .. उनमें से 3 में से 1 अगर कथन है कि यह देखने के लिए कि क्या वे सभी हैं ... बिटफील्ड का उपयोग करना एक बड़ा दर्द है। आपको उन्हें सब टाइप करना होगा .. कोर्स। मैं धारणा कर रहा हूं कि आप केवल बिटफील्ड कार्यक्षमता का उपयोग करते हैं और मिश्रण और मिलान विधियों का उपयोग नहीं करते हैं। बिटसेट के साथ वही बात। जब तक मुझे कक्षा के साथ कुछ याद नहीं आ रहा है .. जो कि शायद ही कभी इसका उपयोग करता है, मुझे काफी संभव है .. मुझे कोई रास्ता नहीं दिखता है जब तक कि आप छेद की चीज़ टाइप न करें या "मानक तरीकों" का उपयोग न करें enum ध्वज सूचियों या 39 बिट्स के लिए कुछ निर्धारित मूल्य और बिट्स & & ऑपरेटर का उपयोग कर)। यह आपके दृष्टिकोण के आधार पर गन्दा हो सकता है। और मुझे पता है .. 64 झंडे बहुत पसंद करते हैं। और बढ़िया। यह है कि आप क्या कर रहे हैं के आधार पर। व्यक्तिगत रूप से बोलते हुए, अधिकांश परियोजनाएं जिनमें मैं शामिल हूं फ्लैग सिस्टम पर निर्भर करता हूं। तो वास्तव में .. 64 अनसुना नहीं है। हालांकि 16 ~ 32 मेरे अनुभव में कहीं अधिक आम है। मैं वास्तव में अभी एक परियोजना में मदद कर रहा हूं जहां एक ध्वज प्रणाली में 640 बिट्स हैं। यह मूल रूप से एक विशेषाधिकार प्रणाली है। तो यह उन्हें एक साथ व्यवस्थित करने के लिए कुछ समझ में आता है ... हालांकि .. स्वीकार्य रूप से .. मैं इसे थोड़ा तोड़ना चाहता हूं .. लेकिन .. आह ... मैं मदद नहीं कर रहा हूं .. नहीं बना रहा।

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