बिटवाइज़ ऑपरेटर क्या हैं?


130

मैं कोई ऐसा व्यक्ति हूँ जो कोड को केवल मनोरंजन के लिए लिखता है और वास्तव में एक अकादमिक या पेशेवर सेटिंग में इसमें विलम्ब नहीं करता है, इसलिए इन बिटवाइज़ ऑपरेटरों की तरह सामान वास्तव में मुझसे बच जाता है।

मैं जावास्क्रिप्ट के बारे में एक लेख पढ़ रहा था, जो स्पष्ट रूप से बिटवाइज़ संचालन का समर्थन करता है। मैं स्थानों में उल्लिखित इस ऑपरेशन को देखता रहता हूं, और मैंने यह जानने की कोशिश की है कि वास्तव में यह क्या है, लेकिन मुझे यह बिल्कुल नहीं लगता। तो वे क्या हैं? स्पष्ट उदाहरण महान होगा! : डी

बस कुछ और सवाल - बिटवाइज़ ऑपरेशन के कुछ व्यावहारिक अनुप्रयोग क्या हैं? आप उन्हें कब इस्तेमाल कर सकते हैं?


2
आगे के प्रश्नों के लिए, आप एक नया SO प्रश्न जोड़ना चाहते हैं और इसे संदर्भित कर सकते हैं। आप शायद इस तरह से उत्तर का एक बेहतर सेट प्राप्त करेंगे।
ग्रेग हेवगिल

जवाबों:


187

चूँकि किसी ने इस विषय पर ध्यान नहीं दिया कि ये उपयोगी क्यों हैं:

झंडे के साथ काम करते समय मैं बिटवाइज़ ऑपरेशंस का बहुत उपयोग करता हूं। उदाहरण के लिए, यदि आप किसी ऑपरेशन में झंडे की एक श्रृंखला को पास करना चाहते हैं (कहते हैं, File.Open()रीड मोड और राइट मोड दोनों सक्षम करें) के साथ, आप उन्हें एकल मान के रूप में पारित कर सकते हैं। यह एक बिटसेट (बाइट, शॉर्ट, इंट, या लॉन्ग) में प्रत्येक बिट के लिए संभव है, यह बताकर पूरा किया गया है। उदाहरण के लिए:

 Read: 00000001
Write: 00000010

इसलिए यदि आप पढ़ना और लिखना चाहते हैं, तो आप (READ | WRITE) पास करेंगे और फिर दोनों को मिला देंगे

00000011

जिसे फिर दूसरे छोर पर डिक्रिप्ट किया जा सकता है जैसे:

if ((flag & Read) != 0) { //...

जो जांचता है

00000011 &
00000001

जो लौटता है

00000001

जो 0 नहीं है, इसलिए ध्वज READ को निर्दिष्ट करता है।

आप विभिन्न बिट्स को टॉगल करने के लिए XOR का उपयोग कर सकते हैं। दिशात्मक इनपुट (ऊपर, नीचे, बाएँ, दाएँ) निर्दिष्ट करने के लिए एक ध्वज का उपयोग करते समय मैंने इसका उपयोग किया है। उदाहरण के लिए, यदि कोई स्प्राइट क्षैतिज रूप से आगे बढ़ रहा है, और मैं चाहता हूं कि यह चारों ओर घूमे:

     Up: 00000001
   Down: 00000010
   Left: 00000100
  Right: 00001000
Current: 00000100

मैं बस (LEFT | RIGHT) के साथ वर्तमान मूल्य को XOR करता हूं, जो इस मामले में LEFT को बंद कर देगा और RIGHT चालू कर देगा।

बिट शिफ्टिंग कई मामलों में उपयोगी है।

x << y

के समान है

x * 2 y

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

int val = (A << 24) | (B << 16) | (C << 8) | D;

यह मानते हुए कि A सबसे महत्वपूर्ण बाइट है और D सबसे कम है। यह समाप्त होगा:

A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011

रंगों को अक्सर इस तरह से संग्रहीत किया जाता है (सबसे महत्वपूर्ण बाइट के साथ या तो अनदेखा किया जाता है या अल्फा के रूप में उपयोग किया जाता है):

A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000

मानों को फिर से खोजने के लिए, बिट्स को दाईं ओर तब तक शिफ्ट करें, जब तक कि यह बचे हुए उच्च-क्रम बिट्स से नकाब न हटा दे:

Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF

0xFFके रूप में ही है 11111111। तो अनिवार्य रूप से, लाल के लिए, आप यह कर रहे होंगे:

Color >> 16 = (filled in 00000000 00000000)11111111 00010101  (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)

x << n, तो n को 2 ^ मान के रूप में होना चाहिए?
अहमद सी।

28

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

int x = 5 & 6;

उत्तर प्रत्येक इनपुट के द्विआधारी विस्तार में निहित है:

  5 = 0 0 0 0 0 1 0 1
& 6 = 0 0 0 0 0 1 1 0
---------------------
      0 0 0 0 0 1 0 0

प्रत्येक कॉलम में प्रत्येक जोड़ी बिट्स को "और" फ़ंक्शन के माध्यम से नीचे की रेखा पर संबंधित आउटपुट बिट देने के लिए चलाया जाता है। तो उपरोक्त अभिव्यक्ति का उत्तर है 4. सीपीयू ने किया है (इस उदाहरण में) 8 अलग "और" समानांतर में संचालन, प्रत्येक स्तंभ के लिए एक।

मैं इसका उल्लेख करता हूं क्योंकि मुझे अभी भी यह याद है कि "अहा!" जब मैंने इस बारे में कई साल पहले सीखा था।


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

27

बिटवाइज़ ऑपरेटर एक समय में थोड़ा सा काम करने वाले ऑपरेटर होते हैं।

AND केवल 1 है यदि इसके दोनों इनपुट 1 हैं।

या 1 है यदि एक या अधिक इनपुट 1 हैं।

XOR केवल 1 है अगर इसके इनपुटों में से एक ठीक 1 है।

यदि इसका इनपुट 0 है तो केवल 1 ही नहीं।

इन्हें सत्य सारणी के रूप में सर्वोत्तम रूप से वर्णित किया जा सकता है। इनपुट्स संभावनाएं शीर्ष और बाईं ओर हैं, परिणामी बिट चार में से एक है (दो के मामले में नहीं है क्योंकि इसमें केवल एक इनपुट है) दो इनपुट के चौराहे पर दिखाए गए मान हैं।

AND|0 1      OR|0 1
---+----    ---+----
  0|0 0       0|0 1
  1|0 1       1|1 1

XOR|0 1     NOT|0 1
---+----    ---+---
  0|0 1        |1 0
  1|1 0

एक उदाहरण यह है कि यदि आप पूर्णांक के निचले 4 बिट्स चाहते हैं, तो आप इसे 15 (बाइनरी 1111) के साथ:

    203: 1100 1011
AND  15: 0000 1111
------------------
 IS  11: 0000 1011

16

ये बिटवाइज़ ऑपरेटर हैं, जो सभी जावास्क्रिप्ट में समर्थित हैं:

  • op1 & op2- ANDऑपरेटर दो बिट्स की तुलना करता है और 1 का परिणाम उत्पन्न करता है यदि दोनों बिट्स 1 हैं; अन्यथा, यह 0 देता है।

  • op1 | op2- ORऑपरेटर दो बिट्स की तुलना करता है और बिट्स पूरक होने पर 1 का परिणाम उत्पन्न करता है; अन्यथा, यह 0 देता है।

  • op1 ^ op2- EXCLUSIVE-ORऑपरेटर दो बिट्स की तुलना करता है और रिटर्न 1 यदि दोनों बिट्स 1 हैं और यह 0 देता है यदि दोनों बिट्स 0 या 1 हैं।

  • ~op1- COMPLEMENTऑपरेटर का उपयोग ऑपरेंड के सभी बिट्स को पलटने के लिए किया जाता है।

  • op1 << op2- SHIFT LEFTऑपरेटर बिट्स को बाईं ओर ले जाता है, सुदूर बाएं बिट को जोड़ता है, और सबसे दाईं ओर 0. का मान प्रदान करता है। बाईं ओर जाने वाला प्रत्येक मूव प्रभावी रूप से op1 को 2 से गुणा करता है।

  • op1 >> op2- SHIFT RIGHTऑपरेटर बिट्स को दाईं ओर ले जाता है, दूर दाएं बिट को जोड़ता है, और बाईं ओर के बिट को 0. निर्दिष्ट करता है। दाईं ओर प्रत्येक चाल प्रभावी रूप से op1 को आधे में विभाजित करती है। बाएं-सबसे अधिक साइन बिट संरक्षित है।

  • op1 >>> op2- SHIFT RIGHT- ZERO FILLऑपरेटर सही करने के लिए बिट्स चलता है, छोड देता है अब तक सही बिट, और निर्दिष्ट वाम-पंथी सही प्रभावी रूप से विभाजित करने के लिए प्रत्येक कदम छमाही में OP1 0. के एक मूल्य सा। बाएं-सबसे साइन बिट को छोड़ दिया गया है।


"अगर बिट पूरक हैं" - वाह?
एंड्री टायुकिन

@AndreyTyukin दो बिट्स पूरक हैं यदि उनमें से एक 1 है और दूसरा 0. है
जेफ हिलमैन

@JeffHillman टिप्पणी में आपके विवरण के अनुसार, 1 और 1 "पूरक" नहीं हैं। फिर यह मेरे लिए स्पष्ट नहीं है कि क्यों 1 | 1देता है 1और क्या नहीं 0, और |फिर कैसे इससे अलग माना जाता है ^। मुझे कुछ दिनों पहले इस क्यू / ए को डुप्लिकेट लक्ष्य के रूप में उपयोग करना था, और मैं चाहता था कि 10 साल बाद इस तरह के सवालों के लिए एक स्पष्ट विहित डुप्लिकेट होगा।
एंड्री टायुकिन

4

इसे थोड़ा और नीचे तोड़ने के लिए, प्रश्न में मूल्य के द्विआधारी प्रतिनिधित्व के साथ बहुत कुछ करना है।

उदाहरण के लिए (दशमलव में):
x = 8
य = १

बाइनरी में बाहर आ जाएगा):
x = 1000
y = 0001

वहां से, आप कम्प्यूटेशनल ऑपरेशन जैसे 'और' या 'या' कर सकते हैं; इस मामले में:
x | य =
1000 
0001 |
------
1001

या ... 9 दशमलव में

उम्मीद है की यह मदद करेगा।


|एक ऑपरेशन है?
Si8

किसी कारण से यह मेरे लिए सबसे अधिक समझ में आता है। फिर भी इस x | y = 1000 0001 |भाग के बारे में निश्चित नहीं है
samayo

4

जब "बिटवाइज़" शब्द का उल्लेख किया जाता है, तो यह कभी-कभी स्पष्ट करता है कि "तार्किक" ऑपरेटर नहीं है।

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

उदाहरण के लिए expr1 && expr2 लें।

वापसी expr1 अगर यह झूठी में परिवर्तित किया जा सकता है; अन्यथा, expr2 देता है। इस प्रकार, जब बूलियन मूल्यों के साथ उपयोग किया जाता है, और दोनों ऑपरेंड सच होने पर && सच हो जाता है; अन्यथा, गलत है।

a = "Cat" && "Dog"     // t && t returns Dog
a = 2 && 4     // t && t returns 4

जैसा कि दूसरों ने नोट किया है, 2 और 4 एक बिटवाइज़ है और इसलिए यह 0 पर वापस आ जाएगा।

आप निम्न को कॉपी कर सकते हैं test.html या कुछ और परीक्षण:

<html>
<body>
<script>
    alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n"
        + "2 && 4 = " + (2 && 4) + "\n"
        + "2 & 4 = " + (2 & 4));
</script>

3

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

संचालन :

  • बिट वाइज और

  • बिटवार या

  • बिट वाइज नहीं

  • बिटवार XOR

  • आदि

सामग्री सूचीबद्ध करें

    AND|0 1        OR|0 1 
    ---+----      ---+---- 
      0|0 0         0|0 1 
      1|0 1         1|1 1 

   XOR|0 1        NOT|0 1 
   ---+----       ---+--- 
     0|0 1           |1 0 
     1|1 0

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

    203: 1100 1011
AND  15: 0000 1111
------------------
  =  11: 0000 1011

बिटवाइज़ ऑपरेटर का उपयोग

  • लेफ्ट-शिफ्ट और राइट-शिफ्ट ऑपरेटर क्रमशः एक्स * 2 वाई से गुणा और विभाजन के बराबर हैं।

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

int main()
{
     int x = 19;
     printf ("x << 1 = %d\n" , x <<1);
     printf ("x >> 1 = %d\n", x >>1);
     return 0;
}
// Output: 38 9
  • & ऑपरेटर का उपयोग यह जांचने के लिए किया जा सकता है कि कोई संख्या विषम है या नहीं

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

int main()
{
    int x = 19;
    (x & 1)? printf("Odd"): printf("Even");
    return 0;
 }
// Output: Odd
  • बिना if elseविवरण के त्वरित न्यूनतम x और y ज्ञात करें

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

int min(int x, int y)
{
    return y ^ ((x ^ y) & - (x < y))
}
  • द्विआधारी रूपांतरण के लिए दशमलव

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

#include <stdio.h>
int main ()
{
    int n , c , k ;
    printf("Enter an integer in decimal number system\n " ) ;
    scanf( "%d" , & n );
    printf("%d in binary number
    system is: \n " , n ) ;
    for ( c = 31; c >= 0 ; c -- )
    {
         k = n >> c ;
         if ( k & 1 )
              printf("1" ) ;
         else
              printf("0" ) ;
      }
      printf(" \n " );
      return 0 ;
}
  • XOR गेट एन्क्रिप्शन लोकप्रिय तकनीक है, क्योंकि इसकी तारीफ और प्रोग्रामर द्वारा रीयर का उपयोग किया जाता है।
  • बिटवाइज XOR ऑपरेटर तकनीकी साक्षात्कार के दृष्टिकोण से सबसे उपयोगी ऑपरेटर है।

बिटवाइज शिफ्टिंग केवल + वी नंबर के साथ काम करता है

इसके अलावा बिटवाइज लॉजिक के उपयोग की एक विस्तृत श्रृंखला है


"शिकायत और फिर ..."?
जोनाथन क्रॉस

The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.ये सही है! muyiy.cn/question/program/102.html
xgqfrms


1

यह इस तरह से सोचने में मदद कर सकता है। यह है कि कैसे और (&) काम करता है:

यह मूल रूप से कहता है कि ये दोनों संख्याएं हैं, इसलिए यदि आपके पास दो नंबर 5 और 3 हैं, तो वे बाइनरी में बदल जाएंगे और कंप्यूटर विचार करेगा

         5: 00000101
         3: 00000011

दोनों एक हैं: 00000001 झूठी है, 1 सच है

तो 5 और 3 का AND एक है। OR (|) ऑपरेटर एक ही काम करता है सिवाय संख्याओं के केवल एक को आउटपुट 1 में से एक होना चाहिए, दोनों को नहीं।


-5

मैं इस बारे में सुनता रहा कि जावास्क्रिप्ट बिटवाइज़ ऑपरेटर्स कितने धीमे थे। मैंने अपने नवीनतम ब्लॉग पोस्ट के लिए कुछ परीक्षण किए और पता चला कि वे कई परीक्षणों में अंकगणितीय विकल्प की तुलना में 40% से 80% तेज थे। शायद वे धीमे रहते थे। आधुनिक ब्राउज़रों में, मैं उनसे प्यार करता हूं।

मेरे पास अपने कोड में एक मामला है जो इस वजह से पढ़ने में तेज और आसान होगा। मैं और अधिक के लिए अपनी आँखें खुली रखेंगे।

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