बिटवाइज ऑपरेटरों के वास्तविक विश्व उपयोग के मामले [बंद]


224

निम्नलिखित बिटकॉइन ऑपरेटरों के कुछ वास्तविक दुनिया उपयोग के मामले क्या हैं?

  • तथा
  • XOR
  • नहीं
  • या
  • वाम / अधिकार शिफ्ट

1
मुझे याद है कि जब मैंने पहली बार उनके बारे में सीखा था तो ऐसा लगा था कि वे केवल निम्न-स्तरीय ग के लिए उपयोग किए जाते हैं ... लेकिन तब से वे टूलबॉक्स में प्रवेश कर चुके हैं और मैं अक्सर उनका उपयोग करता हूं, जिसमें "उच्च-स्तरीय" प्रोग्रामिंग भी शामिल है। वे अभी मेरे लिए + और * की तरह हैं।
ओक

2
@ तोप: मेरे दिमाग में, वास्तविक दुनिया का मतलब कुछ भी हो सकता था लेकिन निम्न स्तर की प्रोग्रामिंग जो बिटवाइज़ ऑपरेटरों का सबसे स्पष्ट उपयोग है।
ओलिवियर लालोंडे



एक क्रमचय में एक लापता संख्या खोजने के लिए बाइनरी एक्सओआर का उपयोग कर सकते हैं: martinkysel.com/codility-permmissingelem-solution
Janac Meena

जवाबों:


216
  • बिट फ़ील्ड (झंडे)
    वे किसी चीज़ का प्रतिनिधित्व करने का सबसे कुशल तरीका हैं जिसका राज्य कई "हाँ या नहीं" गुणों से परिभाषित होता है। ACL एक अच्छा उदाहरण हैं; यदि आपके पास 4 असतत अनुमतियाँ हैं (पढ़ें, लिखें, निष्पादित करें, नीति बदलें), तो इसे कचरे के बजाय 1 बाइट में संग्रहीत करना बेहतर है। इन्हें अतिरिक्त सुविधा के लिए कई भाषाओं में गणना प्रकारों में मैप किया जा सकता है।

  • पोर्ट / सॉकेट पर संचार में
    हमेशा चेकसम, समता, स्टॉप बिट्स, फ्लो कंट्रोल एल्गोरिदम शामिल होते हैं, और इसी तरह, जो आमतौर पर संख्यात्मक मूल्यों के विपरीत व्यक्तिगत बाइट्स के तर्क मूल्यों पर निर्भर करते हैं, क्योंकि माध्यम केवल एक बिट को प्रसारित करने में सक्षम हो सकता है। एक वक़्त।

  • संपीड़न, एन्क्रिप्शन
    ये दोनों बिटवाइज़ एल्गोरिदम पर बहुत अधिक निर्भर हैं। को देखो Deflate एक उदाहरण के लिए एल्गोरिथ्म - सब कुछ बिट्स में है, तो बाइट्स नहीं।

  • परिमित राज्य मशीनें
    मैं मुख्य रूप से हार्डवेयर के कुछ टुकड़े में एम्बेडेड प्रकार की बात कर रहा हूं, हालांकि वे सॉफ्टवेयर में भी पाए जा सकते हैं। ये प्रकृति में मिश्रित कर रहे हैं - वे सचमुच हो रही हो सकता है "संकलित" नीचे लॉजिक गेट का एक समूह के लिए, ताकि वे के रूप में व्यक्त किया जा सकता है AND, OR, NOT, आदि

  • ग्राफ़िक्स प्रोग्रामिंग प्रोग्रामिंग में इन ऑपरेटरों द्वारा उपयोग किए जाने वाले प्रत्येक क्षेत्र में आने के लिए यहाँ मुश्किल से ही पर्याप्त जगह है। XOR(या ^) यहां विशेष रूप से दिलचस्प है क्योंकि एक ही इनपुट को दूसरी बार लागू करने से पहली बार पूर्ववत हो जाएगी। पुराने GUIs ने चयन पर प्रकाश डाला और अन्य ओवरले के लिए इस पर भरोसा किया, ताकि महंगा रेड की जरूरत को खत्म किया जा सके। वे अभी भी धीमे ग्राफिक्स प्रोटोकॉल (यानी दूरस्थ डेस्कटॉप) में उपयोगी हैं।

वे सिर्फ पहले कुछ उदाहरण थे जिनके साथ मैं आया था - यह शायद ही एक विस्तृत सूची है।


Hi @Aaronaught, आपने वास्तव में हमारे साथ एक बहुत अच्छा ज्ञान साझा किया है। मुझे बिटवाइज़ ऑपरेटर की वास्तविक दुनिया के मामलों के बारे में अधिक जानने की दिलचस्पी है। क्या आप हमारे साथ अपना संदर्भ साझा करने का मन करेंगे, इसके बारे में अधिक पढ़ने के लिए वास्तव में उपयोगी होगा।
हीना हुसैन

क्या बिटवाइज़ ऑपरेशंस वैरिएबल गणनाओं के लिए उपयोगी हैं?
एरोन फ्रेंके

47

क्या यह अजीब है?

(value & 0x1) > 0

क्या यह दो (यहां तक) से विभाज्य है?

(value & 0x1) == 0

3
आपके भाषा मूल्य के आधार पर और 0x1> 0 मान के रूप में पार्स किया जा सकता है (0x1> 0)
leeeroy

3
@leyeroy - काफी सच है। कुछ परिजनों को जोड़ा।
सेठ

आधुनिक ऑप्टिमाइज़र भावों को मान में परिवर्तित कर देंगे (मान% 2)! = 0 उपरोक्त अभिव्यक्तियों के लिए स्वचालित रूप से। godbolt.org/z/mYEBH4
फरेराज़ी

26

यहां कुछ सामान्य मुहावरों को अलग-अलग बिट्स के रूप में संग्रहीत झंडे के साथ व्यवहार किया गया है।

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

चार्ट का ध्वज सेट करें:

flags |= Chargeable;

स्पष्ट कॉलरमिसिंग ध्वज:

flags &= ~CallerIDMissing;

परीक्षण करें कि क्या CallerIDMissing और Chargeable सेट हैं:

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}

25

मैंने CMS के लिए सुरक्षा मॉडल लागू करने में बिटवाइज़ ऑपरेशंस का उपयोग किया है। इसमें ऐसे पृष्ठ थे, जिन्हें उपयुक्त समूहों में होने पर उपयोगकर्ताओं द्वारा एक्सेस किया जा सकता है। एक उपयोगकर्ता कई समूहों में हो सकता है, इसलिए हमें यह जांचने की आवश्यकता है कि क्या उपयोगकर्ता समूहों और पृष्ठों के समूहों के बीच एक चौराहा था। इसलिए हमने प्रत्येक समूह को एक अद्वितीय शक्ति -२ पहचानकर्ता, जैसे:

Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100

हम या ये मान एक साथ हैं, और पृष्ठ के साथ मूल्य (एक एकल int के रूप में) संग्रहीत करते हैं। उदाहरण के लिए, यदि कोई पृष्ठ A & B द्वारा एक्सेस किया जा सकता है, तो हम पेज एक्सेस कंट्रोल के रूप में मान 3 (जो बाइनरी में 00000011 है) को स्टोर करते हैं। उसी तरह, हम एक उपयोगकर्ता के साथ ओर्ड समूह के पहचानकर्ताओं के मान को दर्शाते हैं कि वे किस समूह में हैं।

इसलिए यह जांचने के लिए कि क्या कोई दिया गया उपयोगकर्ता किसी दिए गए पृष्ठ तक पहुंच सकता है, आपको बस एक साथ मानों की जरूरत है और यह जांचने के लिए कि क्या मूल्य शून्य नहीं है। यह बहुत तेज़ है क्योंकि यह चेक एकल निर्देश, कोई लूपिंग, कोई डेटाबेस राउंड-ट्रिप में लागू नहीं किया गया है।


24

निम्न स्तर की प्रोग्रामिंग एक अच्छा उदाहरण है। उदाहरण के लिए, हार्डवेयर के कुछ टुकड़े बनाने के लिए आपको मेमोरी-मैप्ड रजिस्टर में एक विशिष्ट बिट लिखने की आवश्यकता हो सकती है, जो आप इसे चाहते हैं:

volatile uint32_t *register = (volatile uint32_t *)0x87000000;
uint32_t          value;
uint32_t          set_bit   = 0x00010000;
uint32_t          clear_bit = 0x00001000;

value = *register;            // get current value from the register
value = value & ~clear_bit;   // clear a bit
value = value | set_bit;      // set a bit
*register = value;            // write it back to the register

इसके अलावा, htonl()और htons()उन ऑपरेटरों &और |ऑपरेटरों का उपयोग करके कार्यान्वित किया जाता है (जिन मशीनों का एंडियननेस (बाइट ऑर्डर) नेटवर्क ऑर्डर से मेल नहीं खाता):

#define htons(a) ((((a) & 0xff00) >> 8) | \
                  (((a) & 0x00ff) << 8))

#define htonl(a) ((((a) & 0xff000000) >> 24) | \
                  (((a) & 0x00ff0000) >>  8) | \
                  (((a) & 0x0000ff00) <<  8) | \
                  (((a) & 0x000000ff) << 24))

7
हर कोई मशीन में नहीं बोलता। क्या आपका दूसरा उदाहरण है?
चाओसपांडियन

7
htons()और htonl()एक स्वैप करने के लिए POSIX कार्य हैं shortया एक longमेजबान (से hनेटवर्क (करने के लिए) endianness n) बाइट क्रम।
कार्ल नॉरम

O (logN) संचालन में थोड़ा-सा उलट-फेर करने के लिए आप इसी तरह की विधि का उपयोग कर सकते हैं।
माइक डेनिमोन

जब मैंने पहली बार देखा तो मुझे लगा कि यह असेंबली है!
0x499602D2

नहीं है htonl()एक 32-बिट के लिए intमूल्य? longकई भाषाओं में 64-बिट का मतलब है।
हारून फ्रेंक

21

मैं उन्हें उदाहरण के लिए, पैक किए गए रंगीन रंगों से आरजीबी (ए) मान प्राप्त करने के लिए उपयोग करता हूं।


और यह वास्तव में जल्दी करता है!
कैलम रोजर्स

C # में यह उन मामलों में से एक है जहां यह वास्तव में पठनीयता और गति के लिए सबसे अच्छा समाधान है।
कैप्टनसी

4
मेरी मशीन पर, एआरजी का प्रतिनिधित्व करने वाले इंट से एकल रंग मूल्य निकालने के दोनों तरीकों की (a & b) >> cतुलना में 5 गुना अधिक तेज है a % d / e। क्रमशः, 1 बिलियन पुनरावृत्तियों के लिए 6.7 और 35.2s।
बेंजी XVI

@BenjiXVI C # में इसके लिए कंपाइलर ऑप्टिमाइज़ेशन हैं। गति अंतर को देखने का कारण यह है क्योंकि, C # में, %मापांक ऑपरेटर नहीं है, यह रेमिनेडर ऑपरेटर है। वे सकारात्मक मूल्यों के बराबर हैं, लेकिन नकारात्मक लोगों के साथ भिन्न हैं। यदि आप उपयुक्त प्रतिबंध प्रदान करते हैं ( उदाहरण uintके intलिए इसके बजाय ) तो दो उदाहरणों की गति समान होनी चाहिए।
हारून फ्रेंक

क्षमा करें, मुझे पता है कि यह एक लंबा समय रहा है। क्या आप कृपया इसका एक उदाहरण दिखा सकते हैं कि हर एक आरजीबी मूल्य प्राप्त करने के लिए उनका उपयोग कैसे करें?
जिंक्स

14

जब मेरे पास बूलियन झंडे का एक गुच्छा होता है, तो मैं उन सभी को एक इंट में संग्रहीत करना पसंद करता हूं।

मैं उन्हें बिटवाइज़-एंड का उपयोग करके बाहर निकालता हूं। उदाहरण के लिए:

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

आदि।


23
उम्मीद है कि वे वास्तव में आपके वास्तविक कोड में स्थिर हैं और जादू नंबर नहीं हैं :)
अर्लज़

1
गैर-निम्न-स्तरीय दुनिया में बूलियन झंडे का उपयोग करने का एक उदाहरण विभिन्न जीयूआई प्लेटफार्मों के साथ सामान कर रहा है। उदाहरण के लिए आप my_button.Style | = STYLE_DISABLED का उपयोग इसे बंद करने के लिए कर सकते हैं।
मॉरिसल

1
मुझे पता है कि यह विषय भाषा अज्ञेय है, लेकिन सी इसे बिट-फ़ील्ड के साथ करने का एक आसान तरीका प्रदान करता है ताकि आप चीजों का उपयोग कर सकें if (flags.feature_one_is_one) { // turn on feature }। यह एएनएसआई सी मानक में है, इसलिए पोर्टेबिलिटी एक मुद्दा नहीं होना चाहिए।
पोलेन्डर

यह स्पष्ट करना अच्छा होगा कि कोड का यह स्निपेट क्या करता है, झंडे को आरंभीकृत क्यों नहीं किया जाता है, "आप उन सभी को एक इंट में स्टोर करें" से क्या मतलब है, नोटेशन क्या उपयोग किया गया है ...
एंजेलो ओपराह

12

& = और:
विशिष्ट बिट्स को मास्क करें।
आप विशिष्ट बिट्स को परिभाषित कर रहे हैं जिन्हें प्रदर्शित किया जाना चाहिए या प्रदर्शित नहीं किया जाना चाहिए। 0x0 और x बाइट में सभी बिट्स को साफ़ कर देगा, जबकि 0xFF x को नहीं बदलेगा। 0x0F निचले निबल में बिट्स प्रदर्शित करेगा।

रूपांतरण:
कम चर वाले बिट चर को पहचानने के लिए बिट्स को समायोजित करना आवश्यक है क्योंकि एक इंट में -1 0xFFFFFFFF है जबकि एक लंबे समय में -1 0xFFFFFFFFFFFFFF है। पहचान को संरक्षित करने के लिए आप रूपांतरण के बाद एक मुखौटा लागू करते हैं।

| = या
बिट सेट करें। यदि वे पहले से सेट हैं, तो बिट्स को अनिश्चित रूप से सेट किया जाएगा। कई डेटास्ट्रक्चर (बिटफ़ील्ड्स) में IS_HSET = 0, IS_VSET = 1 जैसे झंडे होते हैं जिन्हें अनिश्चित रूप से सेट किया जा सकता है। झंडे सेट करने के लिए, आप IS_HSET लागू करें | IS_VSET (C और असेंबली में यह पढ़ना बहुत सुविधाजनक है)

^ = XOR
बिट्स खोजें जो समान या अलग हैं।

~ = नहीं
बिट्स फ्लिप।

यह दिखाया जा सकता है कि इन ऑपरेशनों द्वारा सभी संभावित स्थानीय बिट संचालन को लागू किया जा सकता है। इसलिए यदि आप चाहें, तो आप केवल बिट संचालन द्वारा एक ADD निर्देश लागू कर सकते हैं।

कुछ अद्भुत हैक:

http://www.ugcs.caltech.edu/~wnoise/base2.html
http://www.jjj.de/bitwizardry/bitwizardrypage.html


निम्नलिखित एक लिंक है जो सुपर फास्ट गणित संचालन के लिए AS3 में बिटवाइज़ ऑपरेटरों का उपयोग करने के उत्कृष्ट उदाहरण देता है (लेकिन यह संभवतः अधिकांश भाषाओं में लागू हो सकता है): lab.polygonal.de/2007/05/10/bitwise-gems-fast-fast- पूर्णांक-गणित
भारी मात्रा

मुझे लगता है कि "नहीं" होना चाहिए = ~, नहीं |=, जो OR है।
माइक डेनिमोन

के लिए & = AND- मैं सभी बिट्स क्यों साफ़ करना चाहूंगा, क्यों मैं बाइट का अनमॉडिफाइड संस्करण प्राप्त करना चाहता हूं, और निचले नीबूं के साथ मैं क्या करूं?
भ्रमित

1
@ उलझन में ही सही, एक परिणाम को शून्य करने का सबसे तेज़ / सरल तरीका xorअपने आप से है। मैं उन कुछ कारणों के बारे में सोच सकता हूं जिन्हें आप कम टट्टी निकालना चाहते हैं। खासतौर पर अगर वह निचला कुतरना डेटा संरचना का हिस्सा है और आप इसे मास्क के रूप में या ORकिसी अन्य संरचना के साथ उपयोग करना चाहते हैं ।
जेम्स एम। ले।

11

एन्क्रिप्शन सभी बिटवाइज़ ऑपरेशंस हैं।


4
वास्तव में? एन्क्रिप्शन कार्यान्वयन बिटवाइज़ ऑप्स का उपयोग करने की संभावना है, लेकिन एन्क्रिप्शन एल्गोरिदम आमतौर पर संख्यात्मक शब्दों में वर्णित हैं और बिट प्रतिनिधित्व के संदर्भ में नहीं।
कांस्टेंटिन

1
तो आप उन्हें लागू करने के अलावा अन्य एल्गोरिदम के साथ क्या करते हैं? मैं उत्सुक हूँ।
पुनरावर्ती

2
@Constantin: उदाहरण के लिए देखें, कैसे डेस कार्यान्वित किया जाता है के विवरण: ( en.wikipedia.org/wiki/...
वेन कॉनरोड

1
@recursive, अगर आप मेरे बारे में व्यक्तिगत रूप से पूछ रहे हैं - मैं न तो क्रिप्टोग्राफिक एल्गोरिदम डिजाइन कर रहा हूं और न ही उन्हें लागू कर रहा हूं। लेकिन लोग कई काम करते हैं, जैसे कि सैद्धांतिक कमजोरियों के लिए उनका विश्लेषण करना।
कांस्टेंटिन

@ कॉन्स्टेंटिन: इस पर एक नज़र डालें, यह कई उदाहरणों में से एक है कि कैसे (क्रिप्टोग्राफिक एल्गोरिदम का हिस्सा) आम तौर पर वर्णित किया जाता है: en.wikipedia.org/wiki/Substitution_box
Syntax3rr0r

9

आप उन्हें हैश डेटा के लिए एक त्वरित और गंदे तरीके के रूप में उपयोग कर सकते हैं।

int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;

8

मैं बस ^एक बिट के साथ धारावाहिक संचार के लिए एक चेकसम की गणना करने के लिए लगभग तीन मिनट पहले बिटवाइज़- XOR ( ) का उपयोग करता था ...


7

बिटवाइज़ & का उपयोग बाइट के एक निश्चित हिस्से को मास्क / निकालने के लिए किया जाता है।

1 बाइट चर

 01110010
&00001111 Bitmask of 0x0F to find out the lower nibble
 --------
 00000010

विशेष रूप से शिफ्ट ऑपरेटर (<< >>) का उपयोग अक्सर गणना के लिए किया जाता है।


6

यह बाइट प्रारूप में बिटमैप छवि से रंगों को पढ़ने के लिए एक उदाहरण है

byte imagePixel = 0xCCDDEE; /* Image in RRGGBB format R=Red, G=Green, B=Blue */

//To only have red
byte redColour = imagePixel & 0xFF0000; /*Bitmasking with AND operator */

//Now, we only want red colour
redColour = (redColour >> 24) & 0xFF;  /* This now returns a red colour between 0x00 and 0xFF.

मुझे उम्मीद है कि यह छोटे उदाहरण मदद करते हैं ...।


5

आज की आधुनिक भाषा की अमूर्त दुनिया में, बहुत अधिक नहीं। फ़ाइल IO एक आसान है जो मन में आता है, हालांकि यह कि पहले से ही लागू कुछ पर बिटवाइज़ ऑपरेशन का उपयोग कर रहा है और कुछ ऐसे कार्यों को लागू नहीं कर रहा है जो बुद्धिमान संचालन का उपयोग करता है। फिर भी, एक आसान उदाहरण के रूप में, यह कोड किसी फ़ाइल पर रीड-ओनली विशेषता को हटाने का प्रदर्शन करता है (ताकि इसका उपयोग नए FileStream को निर्दिष्ट करते हुए FileMode.Create के साथ c # में किया जा सके:

//Hidden files posses some extra attibutes that make the FileStream throw an exception
//even with FileMode.Create (if exists -> overwrite) so delete it and don't worry about it!
if(File.Exists(targetName))
{
    FileAttributes attributes = File.GetAttributes(targetName);

    if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
        File.SetAttributes(targetName, attributes & (~FileAttributes.ReadOnly));

    File.Delete(targetName);
}

जहाँ तक कस्टम कार्यान्वयन की बात है, यहाँ एक हालिया उदाहरण है: मैंने अपने वितरित एप्लिकेशन की एक स्थापना से दूसरे में सुरक्षित संदेश भेजने के लिए एक "संदेश केंद्र" बनाया। मूल रूप से, यह ईमेल के अनुरूप है, इनबॉक्स, आउटबॉक्स, सेंट आदि के साथ पूर्ण है, लेकिन इसमें रीड रसीदों के साथ डिलीवरी की गारंटी भी है, इसलिए "इनबॉक्स" और "भेजे" से परे अतिरिक्त सबफ़ोल्डर हैं। यह मेरे लिए सामान्य रूप से "इनबॉक्स में" या "भेजे गए फ़ोल्डर में" क्या है, को परिभाषित करने के लिए एक आवश्यकता थी। भेजे गए फ़ोल्डर में से, मुझे यह जानना होगा कि क्या पढ़ा है और क्या बिना पढ़े है। बिना पढ़े क्या है, मुझे यह जानना होगा कि क्या मिला और क्या नहीं। मैं इस जानकारी का उपयोग एक गतिशील बनाने के लिए करता हूं जहां क्लॉज एक स्थानीय डेटा स्रोत को फ़िल्टर करता है और उपयुक्त जानकारी प्रदर्शित करता है।

यहाँ बताया गया है कि एनम को एक साथ कैसे रखा जाता है:

    public enum MemoView :int
    {
        InboundMemos = 1,                   //     0000 0001
        InboundMemosForMyOrders = 3,        //     0000 0011
        SentMemosAll = 16,                  //     0001 0000
        SentMemosNotReceived = 48,          //     0011
        SentMemosReceivedNotRead = 80,      //     0101
        SentMemosRead = 144,                //     1001
        Outbox = 272,                       //0001 0001 0000
        OutBoxErrors = 784                  //0011 0001 0000
    }

क्या आप देखते हैं कि यह क्या करता है? "इनबॉक्स" enum मान के साथ Bying (&), InboundMemos, मुझे पता है कि InboundMemosForMyOrders इनबॉक्स में है।

यहां उस विधि का एक उबला हुआ संस्करण है जो वर्तमान में चयनित फ़ोल्डर के लिए दृश्य को परिभाषित करने वाले फ़िल्टर का निर्माण और रिटर्न करता है:

    private string GetFilterForView(MemoView view, DefaultableBoolean readOnly)
    {
        string filter = string.Empty;
        if((view & MemoView.InboundMemos) == MemoView.InboundMemos)
        {
            filter = "<inbox filter conditions>";

            if((view & MemoView.InboundMemosForMyOrders) == MemoView.InboundMemosForMyOrders)
            {
                filter += "<my memo filter conditions>";
            }
        }
        else if((view & MemoView.SentMemosAll) == MemoView.SentMemosAll)
        {
            //all sent items have originating system = to local
            filter = "<memos leaving current system>";

            if((view & MemoView.Outbox) == MemoView.Outbox)
            {
                ...
            }
            else
            {
                //sent sub folders
                filter += "<all sent items>";

                if((view & MemoView.SentMemosNotReceived) == MemoView.SentMemosNotReceived)
                {
                    if((view & MemoView.SentMemosReceivedNotRead) == MemoView.SentMemosReceivedNotRead)
                    {
                        filter += "<not received and not read conditions>";
                    }
                    else
                        filter += "<received and not read conditions>";
                }
            }
        }

        return filter;
    }

अत्यंत सरल, लेकिन अमूर्त के स्तर पर एक साफ-सुथरा कार्यान्वयन जिसे आम तौर पर बिटवाइज़ संचालन की आवश्यकता नहीं होती है।


4

Base64 एन्कोडिंग एक उदाहरण है। बेस 64 एनकोडिंग का उपयोग बाइनरी डेटा को ईमेल सिस्टम (और अन्य उद्देश्यों) पर भेजने के लिए एक मुद्रण योग्य पात्रों के रूप में दर्शाने के लिए किया जाता है। Base64 एन्कोडिंग 8 बिट बाइट्स की एक श्रृंखला को 6 बिट कैरेक्टर लुकअप इंडेक्स में परिवर्तित करता है। बेस 64 एनकोडिंग और डिकोडिंग के लिए आवश्यक बिट ऑपरेशंस को लागू करने के लिए बिट ऑपरेशंस, शिफ्टिंग, एंडिंग, ऑरिंग, नोटिंग बहुत उपयोगी हैं।

यह कोर्स अनगिनत उदाहरणों में से केवल 1 है।


4

मुझे आश्चर्य है कि किसी ने भी इंटरनेट युग के लिए स्पष्ट जवाब नहीं उठाया। सबनेट के लिए मान्य नेटवर्क पते की गणना।

http://www.topwebhosts.org/tools/netmask.php


4

आमतौर पर बिटवाइज़ ऑपरेशन्स गुणा / भाग करने की तुलना में तेज़ होते हैं। इसलिए अगर आपको एक चर x को 9 से गुणा करने की आवश्यकता है, तो आप वह करेंगे x<<3 + xजो कुछ चक्रों से तेज होगा x*9। यदि यह कोड एक ISR के अंदर है, तो आप प्रतिक्रिया समय पर बचत करेंगे।

इसी तरह यदि आप एक सारणी का उपयोग एक गोलाकार कतार के रूप में करना चाहते हैं, तो बिट वार ऑपरेशन के साथ चेक के चारों ओर रैप को संभालने के लिए यह तेज़ (और अधिक सुरुचिपूर्ण) होगा। (आपकी सरणी का आकार 2 की शक्ति होना चाहिए)। जैसे: यदि आप सम्मिलित / हटाना चाहते हैं, तो आप tail = ((tail & MASK) + 1)इसके बजाय उपयोग कर सकते हैं tail = ((tail +1) < size) ? tail+1 : 0

यदि आप एक त्रुटि ध्वज को एक साथ कई त्रुटि कोड रखना चाहते हैं, तो प्रत्येक बिट एक अलग मान रख सकता है। आप चेक के रूप में प्रत्येक व्यक्तिगत त्रुटि कोड के साथ कर सकते हैं। यह यूनिक्स त्रुटि कोड में उपयोग किया जाता है।

इसके अलावा एक एन-बिट बिटमैप वास्तव में शांत और कॉम्पैक्ट डेटा संरचना हो सकता है। यदि आप आकार n का संसाधन पूल आवंटित करना चाहते हैं, तो हम वर्तमान स्थिति का प्रतिनिधित्व करने के लिए n-बिट का उपयोग कर सकते हैं।



3

क्या एक संख्या x2 की शक्ति है? (एल्गोरिदम में उदाहरण के लिए उपयोगी जहां एक काउंटर बढ़ा हुआ है, और एक कार्रवाई केवल लघुगणकीय संख्या ली जानी है)

(x & (x - 1)) == 0

पूर्णांक का उच्चतम बिट कौन सा है x? (उदाहरण के लिए इसका उपयोग 2 की न्यूनतम शक्ति को खोजने के लिए किया जा सकता है जो इससे बड़ा है x)

x |= (x >>  1);
x |= (x >>  2);
x |= (x >>  4);
x |= (x >>  8);
x |= (x >> 16);
return x - (x >>> 1); // ">>>" is unsigned right shift

1पूर्णांक का सबसे कम बिट कौन सा है x? (2 से विभाज्य बार खोजने में मदद करता है)

x & -x

अहस्ताक्षरित दाएं शिफ्ट में LHS को अहस्ताक्षरित प्रकार से कास्टिंग करके किया जाता है। आपका अंतिम सूत्र सबसे कम [सेट] बिट को नहीं खोजता है, यह जांचता है कि क्या एक्स की शक्ति 2 है। सबसे कम सेट बिट को खोजने के लिए, करें x & -x
पोटाटोस्वाटर

हम्म, आप सही हैं, किसी तरह मैंने x &-x को पहले स्निपेट के साथ बदल दिया, संपादन के लिए thx
दिमित्रीस आंद्रेउ

3

बिटवाइज़ ऑपरेटर्स लूपिंग सरणियों के लिए उपयोगी हैं, जिनकी लंबाई 2 की शक्ति है। जैसा कि कई लोगों ने उल्लेख किया है, बिटवाइज़ ऑपरेटर बेहद उपयोगी होते हैं और इनका उपयोग झंडे , ग्राफिक्स , नेटवर्किंग , एन्क्रिप्शन में किया जाता है । इतना ही नहीं, लेकिन वे बहुत तेज हैं। मेरा व्यक्तिगत पसंदीदा उपयोग सशर्त बिना किसी सरणी को लूप करना है । मान लें कि आपके पास एक शून्य-सूचकांक आधारित सरणी है (उदाहरण के लिए पहला तत्व का सूचकांक 0 है) और आपको इसे अनिश्चित काल तक लूप करने की आवश्यकता है। अनिश्चित काल तक मेरा मतलब है कि पहले तत्व से आखिरी तक जाना और पहले पर लौटना। इसे लागू करने का एक तरीका है:

int[] arr = new int[8];
int i = 0;
while (true) {
    print(arr[i]);
    i = i + 1;
    if (i >= arr.length) 
        i = 0;
}

यह सबसे सरल तरीका है, यदि आप यदि कथन से बचना चाहते हैं, तो आप मापांक दृष्टिकोण का उपयोग कर सकते हैं :

int[] arr = new int[8];
int i = 0;
while (true) {
    print(arr[i]);
    i = i + 1;
    i = i % arr.length;
}

इन दोनों विधियों के नीचे का पक्ष यह है कि मापांक ऑपरेटर महंगा है, क्योंकि यह पूर्णांक विभाजन के बाद शेष के लिए दिखता है। और पहली विधि एक चलाता है, तो प्रत्येक यात्रा पर बयान। बिटवाइज़ ऑपरेटर के साथ हालांकि यदि आपकी सरणी की लंबाई 2 की शक्ति है, तो आप आसानी से (बिटवाइज़) और ऑपरेटर 0 .. length - 1का उपयोग करके एक अनुक्रम उत्पन्न कर सकते हैं । तो यह जानकर ऊपर से कोड बन जाता है&i & length

int[] arr = new int[8];
int i = 0;
while (true){
    print(arr[i]);
    i = i + 1;
    i = i & (arr.length - 1);
}

यहाँ दिया गया है कि यह कैसे काम करता है। में द्विआधारी प्रारूप हर संख्या है कि 2 की शक्ति 1 से घटाया है केवल लोगों के साथ व्यक्त की है। उदाहरण के लिए 3 बाइनरी में है 11, 7 है 111, 15 है 1111और इसी तरह, आपको विचार मिलता है। अब, यदि आप &किसी भी संख्या के खिलाफ किसी भी संख्या को द्विआधारी में शामिल करते हैं तो क्या होता है ? मान लें कि हम ऐसा करते हैं:

num & 7;

यदि num7 से छोटा या बराबर है तो परिणाम होगा numक्योंकि &1 के साथ प्रत्येक बिट स्वयं है। यदि num7 से बड़ा है, तो &ऑपरेशन के दौरान कंप्यूटर 7 के अग्रणी शून्य पर विचार करेगा, जो निश्चित रूप से &ऑपरेशन के बाद शून्य के रूप में रहेगा, केवल अनुगामी भाग रहेगा। जैसे 9 & 7बाइनरी के मामले में यह दिखेगा

1001 & 0111

परिणाम 0001 होगा जो दशमलव में 1 है और सरणी में दूसरा तत्व है।


आपकी टिप्पणी पाठ को आधा कर देती है यदि आपके सरणी की लंबाई 2 की शक्ति है तो पहले वाक्य में डालनी चाहिए। इस ट्रिक का उपयोग करना एक बहुत ही गंभीर सीमा है। व्यक्तिगत रूप से मैं इसे किसी भी तरह से लागू नहीं करूंगा, कोड को अगर या मॉड दृष्टिकोण से समझना कठिन है ।
जन डॉगगेन

@JanDoggen आप सही हैं, मैं इसे पहले वाक्य में डालूँगा। सरणी के रूप में दो की शक्ति होने के नाते, मेरे अनुभव में उस काम के दौरान कुछ समय से अधिक थे। शायद इसलिए कि यह नेटवर्क और ग्राफिक्स से संबंधित था।
user3552161

1
इस पोस्ट का उद्देश्य यह दिखाना था कि बिटवाइज़ ऑपरेटर संख्याओं, 0, 1, 2, 3, 0, 1, 2 ... के अनुक्रम उत्पन्न करने के लिए उपयोगी होते हैं ... अनुक्रम केवल एक ही था जो दिमाग में आया था।
user3552161

2

मैं उन्हें मल्टी चुनिंदा विकल्पों के लिए उपयोग करता हूं, इस तरह मैं केवल 10 या अधिक के बजाय एक मूल्य संग्रहीत करता हूं


2

यह एक sql रिलेशनल मॉडल में भी उपयोगी हो सकता है, मान लें कि आपके पास निम्न तालिकाएँ हैं: BlogEntry, BlogCategory

परंपरागत रूप से आप एक BlogEntryCategory तालिका का उपयोग करके उन दोनों के बीच एक nn संबंध बना सकते हैं या जब इतने BlogCategory रिकॉर्ड नहीं होते हैं, तो आप BlogEntry में एक मान को कई BlogCategory रिकॉर्ड से लिंक करने के लिए उपयोग कर सकते हैं, जैसे कि आप ध्वजांकित एनमों के साथ करेंगे, अधिकांश RDBMS में भी हैं उस 'ध्वजांकित' कॉलम पर चयन करने के लिए एक बहुत तेज़ ऑपरेटर ...


2

जब आप केवल एक माइक्रोकंट्रोलर के आउटपुट के कुछ बिट्स को बदलना चाहते हैं, लेकिन एक बाइट को लिखने के लिए रजिस्टर, आप कुछ इस तरह से करते हैं (स्यूडोकोड):

char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs

बेशक, कई माइक्रोकंट्रोलर आपको व्यक्तिगत रूप से प्रत्येक बिट को बदलने की अनुमति देते हैं ...


यह किस भाषा में माना जाता है?
कार्सन मायर्स

@ करसन: कोई भाषा नहीं, यह छद्म कोड है। जब मैंने वास्तव में किया है कि कुछ साल पहले यह विधानसभा था, लेकिन मुझे लगता है कि यह सी में करना आसान है। सिर के लिए धन्यवाद, मैं इसे स्पष्ट करने के लिए अपडेट करूंगा
एमिलियो एम बुमचार

मैंने टिप्पणियों को बदलने का उत्तर संपादित किया ताकि हाइलाइटिंग इतना ठग न सके। और मैं देख रहा हूं, मुझे लगा कि यह C हो सकता है लेकिन आपने 0b का उपयोग किया है ... संकेतन जो मैं चाहता हूं कि वह सी में उपलब्ध था
कार्सन मायर्स

2

यदि आप कभी भी अपने संख्या मॉड (%) 2 की एक निश्चित शक्ति की गणना करना चाहते हैं, तो आप उपयोग कर सकते हैं yourNumber & 2^N-1, जो इस मामले में समान है yourNumber % 2^N

number % 16 = number & 15;
number % 128 = number & 127;

यह संभवत: केवल एक बहुत बड़े लाभांश के साथ मापांक ऑपरेशन के विकल्प के रूप में उपयोगी है जो 2 ^ N है ... लेकिन फिर भी मापांक ऑपरेशन पर इसकी गति को बढ़ावा देना .NET 2.0 पर मेरे परीक्षण में नगण्य है। मुझे संदेह है कि आधुनिक कंपाइलर पहले से ही इस तरह के अनुकूलन करते हैं। क्या किसी को भी इस बारे में अधिक पता है?


कंपाइलर इस ऑप्टिमाइज़ेशन का उपयोग करते हैं ... लेकिन अगर आपको ऑप्टिमाइज़ेशन के बारे में पता नहीं था, तो आप एक विभाजक लेने में विफल हो सकते हैं जो कि 2. की सटीक शक्ति है
बेन वायगेट

यह स्थिति पर निर्भर करता है। सी # में यह वास्तव में अलग-अलग परिणाम पैदा करता है, जैसा %कि रेमिनेडर ऑपरेशन है, वे नकारात्मक तरीके से अलग व्यवहार करते हैं। हालाँकि, यदि आप पास uintहो जाते हैं %, तो C # संकलक वास्तव में बिटवाइज़ का उपयोग करके मशीन कोड का उत्पादन करेगा और जब दूसरा तर्क दो की पूर्व-ज्ञात शक्ति है।
आरोन फ्रेंके

1

मैंने उन्हें भूमिका आधारित अभिगम नियंत्रण प्रणालियों में उपयोग किया है।


1

यहाँ मेरे सवाल में एक वास्तविक दुनिया का उपयोग है -
केवल पहले WM_KEYDOWN अधिसूचना का जवाब दें?

जब विंडोज़ सी एपी बिट 30 में WM_KEYDOWN संदेश का उपभोग करते हैं, तो पिछले प्रमुख स्थिति को निर्दिष्ट करता है। मान 1 है यदि संदेश भेजने से पहले कुंजी नीचे है, या यदि कुंजी ऊपर है तो यह शून्य है


1

वे ज्यादातर बिटवाइज़ ऑपरेशन (आश्चर्य) के लिए उपयोग किए जाते हैं। यहाँ PHP कोडबेस में पाए जाने वाले कुछ वास्तविक दुनिया उदाहरण हैं।

अक्षरों को सांकेतिक अक्षरों में बदलना:

if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {

डेटा संरचनाएं:

ar_flags = other->ar_flags & ~SPL_ARRAY_INT_MASK;

डेटाबेस ड्राइवर:

dbh->transaction_flags &= ~(PDO_TRANS_ACCESS_MODE^PDO_TRANS_READONLY);

संकलक कार्यान्वयन:

opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;

1

जब भी मैंने पहली बार C प्रोग्रामिंग शुरू की, मुझे सत्य सारणी और वह सब समझ में आया, लेकिन यह सब वास्तव में इसका उपयोग करने के लिए क्लिक नहीं करता था जब तक कि मैं इस लेख को नहीं पढ़ता http://www.gamedev.net/reference/articles/article1563.asp (जो वास्तविक जीवन के उदाहरण देता है)


1
नहीं, ऐसा नहीं है। C में, यदि x == 1और y == 2, तो x || y1 का मूल्यांकन करता है, और x | y0. का मूल्यांकन करता है और न ही मैं देखता हूं कि किसी भी तरह x^trueसे बेहतर क्यों है !x। यह अधिक टाइपिंग, कम मुहावरेदार है, और अगर xऐसा नहीं होता है तो boolयह अविश्वसनीय है।
डेविड थॉर्नले

ओह रुको .. हाँ, यह मेरी ओर से गूंगा है .. मैं आज सीधे नहीं सोच सकता।
अर्लज़

x | y 3 का मूल्यांकन करता है (संपादित करें: nvm, मैं देखता हूं कि आप कुछ दूर संपादित किए गए थे!)
Pod

1
@DavidThornley: एक मामले में जब x^trueसे बेहतर है !xहै some->complicated().member->lookup ^= true; एकल ऑपरेटरों की कोई यौगिक-असाइनमेंट संस्करण हैं।
बेन वोइगट

1

मुझे नहीं लगता कि यह बिटवाइज़ के रूप में गिना जाता है, लेकिन रूबी का ऐरे सामान्य पूर्णांक बिटवाइज़ ऑपरेटरों के माध्यम से सेट संचालन को परिभाषित करता है। तो [1,2,4] & [1,2,3] # => [1,2]। इसी के लिए a ^ b #=> set differenceऔर a | b #=> union


1

हनोई रैखिक समाधान का टॉवर समस्या को हल करने के लिए बिटवाइज़ संचालन का उपयोग करता है।

public static void linear(char start, char temp, char end, int discs)
{
    int from,to;
    for (int i = 1; i < (1 << discs); i++) {
        from = (i & i-1) % 3;
        to = ((i | i-1) + 1) % 3;
        System.out.println(from+" => "+to);
    }
}

इस समाधान के लिए स्पष्टीकरण यहां पाया जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.