Bitwise অপারেশন এবং ব্যবহার


102

এই কোডটি বিবেচনা করুন:

x = 1        # 0001
x << 2       # Shift left 2 bits: 0100
# Result: 4

x | 2        # Bitwise OR: 0011
# Result: 3

x & 1        # Bitwise AND: 0001
# Result: 1

আমি পাইথনের পাটিগণিত অপারেটরগুলি (এবং অন্যান্য ভাষাগুলি) বুঝতে পারি, তবে আমি কখনও 'বিটওয়াইজ' অপারেটরগুলিকে খুব ভাল বুঝতে পারি নি। উপরের উদাহরণে (পাইথনের বই থেকে) আমি বাম শিফটটি বুঝতে পারি তবে অন্য দুটিটি নয়।

এছাড়াও, বিটওয়াইজ অপারেটরগুলি আসলে কীসের জন্য ব্যবহৃত হয়? আমি কিছু উদাহরণ প্রশংসা করব।


11
এই স্বার্থ হতে পারে: stackoverflow.com/questions/276706/what-are-bitwise-operators
outis

এটিও আগ্রহের বিষয় হতে পারে: স্ট্যাকওভারফ্লো
ফিলিপ ওগার

উত্তর:


163

বিটওয়াইজ অপারেটরগুলি এমন অপারেটর যা বহু-বিট মানগুলিতে কাজ করে, তবে ধারণাগতভাবে একবারে এক বিট।

  • ANDযদি এর উভয় ইনপুট 1 হয় তবে অন্যথায় 0 হয়।
  • ORএর এক বা উভয় ইনপুট 1 হলে 1 হয়, অন্যথায় 0 হয়।
  • XORএর ইনপুটগুলির মধ্যে একটি হ'ল 1 হ'ল অন্যথায় এটি 0 হয়।
  • NOT এর ইনপুট 0 হলেই 1 হয়, অন্যথায় 0 হয়।

এগুলি প্রায়শই সত্য সারণী হিসাবে প্রদর্শিত হতে পারে। ইনপুট সম্ভাবনাগুলি শীর্ষে এবং বামে রয়েছে, ফলাফল বিট চারটিগুলির মধ্যে একটি (দুটিতে এর ক্ষেত্রে কেবল একটি ইনপুট থাকে না বলে) ইনপুটগুলির ছেদটিতে দেখানো মানগুলি।

AND | 0 1     OR | 0 1     XOR | 0 1    NOT | 0 1
----+-----    ---+----     ----+----    ----+----
 0  | 0 0      0 | 0 1       0 | 0 1        | 1 0
 1  | 0 1      1 | 1 1       1 | 1 0

একটি উদাহরণ হ'ল যদি আপনি কেবল একটি পূর্ণসংখ্যার 4 টি বিট চান তবে আপনি এবং এটি 15 (বাইনারি 1111) সহ:

    201: 1100 1001
AND  15: 0000 1111
------------------
 IS   9  0000 1001

সেই ক্ষেত্রে 15-এ শূন্য বিটগুলি কার্যকরভাবে ফিল্টার হিসাবে কাজ করে, ফলাফলগুলিতে বিটগুলিও শূন্য হতে বাধ্য করে।

তদতিরিক্ত , >>এবং <<প্রায়শই বিটওয়াইস অপারেটর হিসাবে অন্তর্ভুক্ত থাকে এবং তারা যথাক্রমে ডান এবং একটি নির্দিষ্ট সংখ্যক বিট দ্বারা একটি বামকে "শিফট" করে, বিটগুলি ফেলে দেয় যে প্রান্তটি আপনি সরে যাচ্ছেন সেই রোলগুলি ফেলে দেয় এবং শূন্য বিটগুলিতে খাওয়ায় অন্য প্রান্ত.

সুতরাং, উদাহরণস্বরূপ:

1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000

দ্রষ্টব্য যে পাইথনের বাম শিফটটি অস্বাভাবিক, কারণ এটি কোনও নির্দিষ্ট প্রস্থ ব্যবহার করে না যেখানে বিটগুলি ফেলে দেওয়া হয় - যখন অনেকগুলি ভাষা ডেটা টাইপের ভিত্তিতে একটি নির্দিষ্ট প্রস্থ ব্যবহার করে, পাইথন কেবলমাত্র অতিরিক্ত বিটগুলি সরবরাহ করতে প্রস্থটি প্রসারিত করে। পাইথনে বিযুক্তির আচরণ পেতে, আপনি andকিছুটা বাম দিক দিয়ে বাম শিফটটি অনুসরণ করতে পারেন যেমন একটি 8-বিট মান বাম চারটি বিট স্থানান্তর করতে:

bits8 = (bits8 << 4) & 255

যে মাথায় রেখে, bitwise অপারেটরদের এর অন্য একটি উদাহরণ যদি আপনি দুই 4-বিট মান যে আপনি একটি 8-বিট এক প্যাক করতে চান, আপনি আপনার অপারেটরের সব তিনটি ব্যবহার করতে পারেন (হয় left-shift, andএবং or):

packed_val = ((val1 & 15) << 4) | (val2 & 15)
  • & 15অপারেশন নিশ্চিত করুন যে যদি দুটি মানই কেবলমাত্র ছোট হাতের 4 টি বিট আছে করতে হবে।
  • << 4একটি 4-বিট স্থানান্তর স্থানান্তর করতে বাম val1শীর্ষ মধ্যে একটি 8-বিট মান 4 বিট।
  • |কেবল এই দুটি একসঙ্গে সম্মিলন।

যদি val17 হয় এবং val24 হয়:

                val1            val2
                ====            ====
 & 15 (and)   xxxx-0111       xxxx-0100  & 15
 << 4 (left)  0111-0000           |
                  |               |
                  +-------+-------+
                          |
| (or)                0111-0100

43

একটি সাধারণ ব্যবহার:

| নির্দিষ্ট বিট 1 এ সেট করতে ব্যবহৃত হয়

& নির্দিষ্ট কিছু পরীক্ষা বা সাফ করার জন্য ব্যবহৃত হয়

  • কিছুটা সেট করুন (যেখানে এন বিট সংখ্যা, এবং 0 সর্বনিম্ন উল্লেখযোগ্য বিট):

    unsigned char a |= (1 << n);

  • কিছুটা সাফ করুন:

    unsigned char b &= ~(1 << n);

  • কিছুটা টগল করুন:

    unsigned char c ^= (1 << n);

  • কিছুটা পরীক্ষা করুন:

    unsigned char e = d & (1 << n);

উদাহরণস্বরূপ আপনার তালিকার ক্ষেত্রে নিন:

x | 2সেট বিট 1 ব্যবহার করা হয় x1 থেকে

x & 1বিট 0 এর x1 বা 0 হয় কিনা পরীক্ষা করতে ব্যবহৃত হয়


38

বিটওয়াইজ অপারেটরগুলি আসলে কীসের জন্য ব্যবহৃত হয়? আমি কিছু উদাহরণ প্রশংসা করব।

বিটওয়াইজ অপারেশনগুলির সর্বাধিক সাধারণ ব্যবহার হেক্সাডেসিমাল রঙগুলি পার্স করার জন্য।

উদাহরণস্বরূপ, এখানে একটি পাইথন ফাংশন যা একটি স্ট্রিং পছন্দ করে #FF09BEএবং তার লাল, সবুজ এবং নীল মানগুলির একটি দ্বিগুণ দেয়।

def hexToRgb(value):
    # Convert string to hexadecimal number (base 16)
    num = (int(value.lstrip("#"), 16))

    # Shift 16 bits to the right, and then binary AND to obtain 8 bits representing red
    r = ((num >> 16) & 0xFF)

    # Shift 8 bits to the right, and then binary AND to obtain 8 bits representing green
    g = ((num >> 8) & 0xFF)

    # Simply binary AND to obtain 8 bits representing blue
    b = (num & 0xFF)
    return (r, g, b)

আমি জানি যে এটির জন্য আরও কার্যকর উপায় রয়েছে তবে আমি বিশ্বাস করি যে এটি একটি সংক্ষিপ্ত উদাহরণ যা উভয় শিফট এবং বিটওয়াইজ বুলিয়ান অপারেশনগুলিকে চিত্রিত করে।


14

আমি মনে করি যে প্রশ্নের দ্বিতীয় অংশ:

এছাড়াও, বিটওয়াইজ অপারেটরগুলি আসলে কীসের জন্য ব্যবহৃত হয়? আমি কিছু উদাহরণ প্রশংসা করব।

কেবলমাত্র আংশিকভাবে সম্বোধন করা হয়েছে। এই বিষয়টি আমার দুটি সেন্ট।

প্রচুর অ্যাপ্লিকেশনগুলির সাথে ডিল করার সময় প্রোগ্রামিং ভাষার বিটওয়াইজ অপারেশনগুলি মৌলিক ভূমিকা পালন করে। এই ধরণের অপারেশন ব্যবহার করে প্রায় সমস্ত নিম্ন-স্তরের কম্পিউটিং করা আবশ্যক।

সমস্ত অ্যাপ্লিকেশনগুলিতে দুটি নোডের মধ্যে ডেটা প্রেরণের প্রয়োজন যেমন:

  • কম্পিউটার নেটওয়ার্ক;

  • টেলিযোগাযোগ অ্যাপ্লিকেশন (সেলুলার ফোন, স্যাটেলাইট যোগাযোগ, ইত্যাদি),

যোগাযোগের নিম্ন স্তরের স্তরে, ডেটা সাধারণত ফ্রেম বলা হয় যা পাঠানো হয় । ফ্রেমগুলি কেবল বাইটের স্ট্রিং যা কোনও শারীরিক চ্যানেলের মাধ্যমে প্রেরণ করা হয়। এই ফ্রেম সাধারণত প্রকৃত তথ্য প্লাস (বাইটস কোডেড) যে কি বলা হয় অংশ কিছু অন্যান্য ক্ষেত্র ধারণ হেডার । শিরোনামটিতে সাধারণত বাইট থাকে যা যোগাযোগের অবস্থার সাথে সম্পর্কিত কিছু তথ্য এনকোড করে (যেমন, পতাকা (বিট) সহ), ফ্রেম কাউন্টার, সংশোধন এবং ত্রুটি সনাক্তকরণ কোড ইত্যাদি frame ডেটা প্রেরণের জন্য ফ্রেমগুলি, আপনার অবশ্যই বিটওয়াইজ অপারেশনগুলির প্রয়োজন হবে।

সাধারণভাবে, সেই ধরণের অ্যাপ্লিকেশনগুলির সাথে কাজ করার সময়, একটি এআইপিআই উপলব্ধ থাকে যাতে আপনাকে সেই সমস্ত বিবরণ মোকাবেলা করতে হবে না। উদাহরণস্বরূপ, সমস্ত আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ সকেট সংযোগের জন্য লাইব্রেরি সরবরাহ করে, সুতরাং আপনাকে টিসিপি / আইপি যোগাযোগের ফ্রেমগুলি তৈরি করার দরকার নেই। তবে সেই ভাল লোকেরা সম্পর্কে ভাবুন যা আপনার জন্য সেই এপিআইগুলিকে প্রোগ্রাম করেছিল, তাদের অবশ্যই ফ্রেমের নির্মাণের সাথে মোকাবেলা করতে হয়েছিল; নিম্ন-স্তর থেকে উচ্চ-স্তরের যোগাযোগের দিকে এগিয়ে যেতে সমস্ত ধরণের বিটওয়াইজ অপারেশন ব্যবহার করে।

একটি সুনির্দিষ্ট উদাহরণ হিসাবে, কল্পনা করুন যে কেউ আপনাকে এমন একটি ফাইল দেয় যা কাঁচা ডেটা ধারণ করে যা সরাসরি টেলিযোগযোগ হার্ডওয়্যার দ্বারা ধরা হয়েছিল। এই ক্ষেত্রে, ফ্রেমগুলি সন্ধান করার জন্য আপনাকে ফাইলের কাঁচা বাইটগুলি পড়তে হবে এবং কিছুটা সিঙ্ক্রোনাইজেশন শব্দগুলি অনুসন্ধান করার চেষ্টা করবে, যা কিছুটা বিট করে ডেটা স্ক্যান করে। সিঙ্ক্রোনাইজেশন শব্দগুলি শনাক্ত করার পরে, আপনাকে প্রকৃত ফ্রেমগুলি গ্রহণ করতে হবে এবং প্রেরণ করা হচ্ছে এমন প্রকৃত ডেটা পেতে প্রয়োজনে সেগুলি শিফট করতে হবে (এবং এটি গল্পের শুরু মাত্র)।

অ্যাপ্লিকেশনটির আরও একটি ভিন্ন স্বল্প স্তরের পরিবার হ'ল যখন আপনাকে কিছু (প্রাচীন ধরণের) বন্দর যেমন সমান্তরাল এবং সিরিয়াল বন্দর ব্যবহার করে হার্ডওয়্যার নিয়ন্ত্রণ করতে হয়। এই বন্দরগুলি কিছু বাইট সেট করে নিয়ন্ত্রণ করা হয়, এবং সেই বাইটগুলির প্রতিটি বিট নির্দেশাবলীর জন্য সেই বন্দরটির জন্য নির্দিষ্ট অর্থ (উদাহরণস্বরূপ http://en.wikedia.org/wiki/Parallel_port দেখুন )। আপনি যদি সেই সফ্টওয়্যারটি দিয়ে কিছু তৈরি করেন এমন সফ্টওয়্যার তৈরি করতে চান তবে বন্দরটি যে বাইটগুলি বোঝায় সেগুলিতে আপনি যে নির্দেশাবলী সম্পাদন করতে চান তা অনুবাদ করতে আপনার বিটওয়াইজ অপারেশনগুলির প্রয়োজন হবে।

উদাহরণস্বরূপ, যদি আপনার অন্যান্য কিছু ডিভাইস নিয়ন্ত্রণ করতে সমান্তরাল বন্দরের সাথে কিছু শারীরিক বোতাম সংযুক্ত থাকে তবে এটি কোডের একটি লাইন যা আপনি নরম অ্যাপ্লিকেশনটিতে খুঁজে পেতে পারেন:

read = ((read ^ 0x80) >> 4) & 0x0f; 

আশা করি এর অবদান আছে।


আমি en.wikedia.org/wiki/Bit_banging কে আরও একটি উপায় হিসাবে যুক্ত করব বিশেষত যদি সমান্তরাল এবং সিরিয়াল বন্দরগুলির বিষয়ে উদাহরণ পড়ি যেখানে বিটওয়াইজ অপারেশনগুলি কার্যকর হতে পারে।
ড্যান

6

আমি আশা করি এটি এই দুটি ব্যাখ্যা করে:

x | 2

0001 //x
0010 //2

0011 //result = 3

x & 1

0001 //x
0001 //1

0001 //result = 1

4
ওফ ... পশ্চিমে দ্রুততম বন্দুক হওয়ার চেষ্টা করেছিল .... এমন এক নির্বোধ হিসাবে শেষ হয়েছিল যিনি দু'জনের জন্য
বাইনারিও

1
x & 1প্রভাব হিসাবে ভাল হিসাবে বর্ণনা করে না x & 2
ডানসালমো

5

0 টি মিথ্যা এবং 1 টি সত্য হিসাবে ভাবেন। তারপরে বিটওয়াইজ এবং (&) এবং বা (|) ঠিক নিয়মিত এবং এবং অথবা তারা বাদে মানটিতে সমস্ত বিট একবারে করে like সাধারণত আপনি তাদের পতাকাগুলির জন্য ব্যবহৃত দেখতে পাবেন যদি আপনার কাছে 30 টি বিকল্প সেট করা যায় (উইন্ডোতে আঁকুন শৈলী হিসাবে বলুন) আপনি প্রতিটি সেট করতে বা আনসেট করতে 30 টি আলাদা বুলিয়ান মান পাস করতে চান না তাই আপনি ব্যবহার করুন | বিকল্পগুলিকে একক মানের সাথে সংযুক্ত করতে এবং তারপরে আপনি প্রতিটি বিকল্প সেট করা আছে কিনা তা পরীক্ষা করে দেখতে & ব্যবহার করতে পারেন। এই শৈলীর পতাকা উত্তোলন ওপেনজিএল দ্বারা প্রচুর ব্যবহৃত হয়। যেহেতু প্রতিটি বিট পৃথক পতাকা হ'ল আপনি দুটি (দুটি উরফ সংখ্যা যা কেবল একটি বিট সেট রয়েছে) 1 (2 ^ 0) 2 (2 ^ 1) 4 (2 ^ 2) 8 (2 ^ 3) দুটির শক্তি আপনাকে জানায় যে পতাকাটি চালু থাকলে কোন বিট সেট করা আছে।

এছাড়াও দ্রষ্টব্য 2 = 10 তাই x | 2 110 (6) নয় 111 (7) যদি কোনও বিট ওভারল্যাপ হয় না (যা এই ক্ষেত্রে সত্য) | সংযোজন মত কাজ করে।


5

আমি এটি উপরে বর্ণিত দেখতে পাইনি তবে আপনি কিছু লোকগণিতগুলিও গাণিতিক ক্রিয়াকলাপের জন্য বাম এবং ডান শিফট ব্যবহার করতে দেখবেন। এক্স দ্বারা বামে স্থানান্তর 2 ^ x (যতক্ষণ না এটি উপচে পড়ে না) দ্বারা গুণনের সমতুল্য এবং ডান শিফট 2 ^ x দ্বারা বিভক্ত হওয়ার সমান।

সম্প্রতি আমি লোককে দ্বিগুণ এবং অর্ধবৃত্ত করার জন্য x << 1 এবং x >> 1 ব্যবহার করতে দেখেছি, যদিও তারা নিশ্চিত নয় যে তারা কেবল চালাক হওয়ার চেষ্টা করছে বা যদি সাধারণ অপারেটরগুলির থেকে সত্যই কোনও স্বতন্ত্র সুবিধা থাকে।


1
আমি পাইথন সম্পর্কে জানি না, তবে সি বা এমনকি নিম্ন - অ্যাসেমব্লির মতো নিম্ন স্তরের ভাষাগুলিতে, বিটওয়াস শিফটটি অনেক বেশি দক্ষ। পার্থক্যটি দেখতে, আপনি সি তে একটি প্রোগ্রাম লিখতে পারেন এটি প্রতিটি উপায়ে করে এবং কেবল সমাবেশ কোডটি সংকলন করতে পারেন (বা যদি আপনি সমাবেশ ল্যাং জানেন, আপনি ইতিমধ্যে এটি জানতেন :))। নির্দেশাবলীর সংখ্যার পার্থক্য দেখুন।
0xc0de

2
বিট শিফট অপারেটরগুলি ব্যবহার করার বিরুদ্ধে আমার যুক্তিটি হ'ল যে বেশিরভাগ আধুনিক সংকলক সম্ভবত পাটিগণিত ক্রিয়াকলাপগুলি ইতিমধ্যে অপ্টিমাইজ করছে যাতে চতুরতা সবচেয়ে ভাল হয় বা কম্পাইলারের সাথে সবচেয়ে খারাপ লড়াই হয়। সি, সংকলক, বা সিপিইউ ডিজাইনে আমার কোনও দক্ষতা নেই এবং তাই আমি সঠিক বলে ধরে নিই না। :)
পি স্টলওয়ার্থ

এটি আরও বেশি হওয়া উচিত। আমাকে এমন কিছু কোডের সাথে ডিল করতে হয়েছিল যা বিটওয়াইস অপারেটরটি ঠিক সেভাবে ব্যবহার করছিল, এবং এই উত্তরটি আমাকে জিনিসগুলি বের করতে সহায়তা করেছিল।
ফিলিপ ওগার

4

সেট

গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে সেটগুলি একত্রিত করা যায়।

  • ইউনিয়ন অপারেটর |দুটি সেট একত্রিত করে একটিতে একটি নতুন আইটেম যুক্ত করে।
  • চৌরাস্তা অপারেটর কেবল &দুজনেই আইটেম পায়।
  • পার্থক্য অপারেটর -প্রথম সেটে আইটেম পায় তবে দ্বিতীয়টিতে নয়।
  • প্রতিসম পার্থক্য অপারেটর ^উভয় সেটে আইটেম পেয়েছে, তবে উভয়ই নয়।

এটি নিজে চেষ্টা করো:

first = {1, 2, 3, 4, 5, 6}
second = {4, 5, 6, 7, 8, 9}

print(first | second)

print(first & second)

print(first - second)

print(second - first)

print(first ^ second)

ফলাফল:

{1, 2, 3, 4, 5, 6, 7, 8, 9}

{4, 5, 6}

{1, 2, 3}

{8, 9, 7}

{1, 2, 3, 7, 8, 9}

এই উত্তরটি পুরোপুরি প্রশ্নের সাথে সম্পর্কিত নয় এবং মনে হয় এটি অন্য কোথাও অনুলিপি করে আটকানো হয়েছে।
ডক্টফ্রেড

প্রশ্নটি জিজ্ঞাসা করে "বিটওয়াইস অপারেটরগুলি আসলে কীসের জন্য ব্যবহৃত হয়?"। এই উত্তরটি বিটওয়াইস অপারেটরগুলির একটি কম পরিচিত তবে খুব দরকারী ব্যবহার সরবরাহ করে।
তাইগ্যাং

3

এই উদাহরণটি আপনাকে চারটি 2 বিট মানের জন্য ক্রিয়াকলাপ দেখায়:

10 | 12

1010 #decimal 10
1100 #decimal 12

1110 #result = 14

10 & 12

1010 #decimal 10
1100 #decimal 12

1000 #result = 8

ব্যবহারের একটি উদাহরণ এখানে:

x = raw_input('Enter a number:')
print 'x is %s.' % ('even', 'odd')[x&1]

2

আর একটি সাধারণ ব্যবহারের ক্ষেত্রে ফাইল অনুমতিগুলি পরীক্ষা করা / পরীক্ষা করা। পাইথন স্ট্যাট মডিউলটি দেখুন: http://docs.python.org/library/stat.html

উদাহরণস্বরূপ, কোনও ফাইলের অনুমতিগুলি একটি কাঙ্ক্ষিত অনুমতি সেটের সাথে তুলনা করতে আপনি কিছু করতে পারেন:

import os
import stat

#Get the actual mode of a file
mode = os.stat('file.txt').st_mode

#File should be a regular file, readable and writable by its owner
#Each permission value has a single 'on' bit.  Use bitwise or to combine 
#them.
desired_mode = stat.S_IFREG|stat.S_IRUSR|stat.S_IWUSR

#check for exact match:
mode == desired_mode
#check for at least one bit matching:
bool(mode & desired_mode)
#check for at least one bit 'on' in one, and not in the other:
bool(mode ^ desired_mode)
#check that all bits from desired_mode are set in mode, but I don't care about 
# other bits.
not bool((mode^desired_mode)&desired_mode)

আমি ফলাফলগুলি বুলিয়ান হিসাবে নিক্ষেপ করেছি, কারণ আমি কেবল সত্য বা মিথ্যা সম্পর্কে চিন্তা করি, তবে প্রতিটিটির জন্য বিন () মানগুলি মুদ্রণ করা সার্থক অনুশীলন হবে।


1
আপনি শেষ উদাহরণে ভুল। এখানে কিভাবে দেখে মনে হচ্ছে করা উচিত: not bool((mode ^ desired_mode) & 0777)। অথবা (সহজভাবে বোঝার জন্য): not (mode & 0777) ^ desired_mode == 0। এবং কেবল আকর্ষণীয় বিট ছেড়ে যাবে, এক্সওআর সমস্ত পছন্দসই বিট কী সেট করা আছে তা যাচাই করবে। এর == 0তুলনায় সুস্পষ্ট তুলনা বেশি অর্থবহ bool()
ভাদিম ফিন্ট

আমি মনে করি না এটি ফাইল অপারেশনের জন্য নির্দিষ্ট। উদাহরণস্বরূপ, পাইকিউটিতে আপনি এর জন্য কিছু অনুরূপ করেন setWindowFlags। উদাহরণ: setWindowFlags(SplashScreen | WindowStaysOnTopHint)। আমি এখনও এই বিভ্রান্তিকরটিকে খুঁজে পাই, যেমন মনে হয় আপনি যে 'টগল'-এ সেট করছেন সেটি টোগলের মতো বলে মনে হচ্ছে যাতে এটি' এবং 'এরকম ক্ষেত্রে আরও স্বজ্ঞাত বলে মনে হয়।
এরিক 1

2

সত্যিকারের-মিথ্যা তথ্যের অ্যারেগুলি উপস্থাপন করতে বৈজ্ঞানিক কম্পিউটিংয়ে পূর্ণসংখ্যার বিট উপস্থাপনাগুলি প্রায়শই ব্যবহৃত হয় কারণ বুলিয়ানগুলির একটি অ্যারের মাধ্যমে পুনরাবৃত্ত হওয়ার চেয়ে বিটওয়াইজ অপারেশন অনেক দ্রুত। (উচ্চ স্তরের ভাষাগুলি কিছুটা অ্যারের ধারণাটি ব্যবহার করতে পারে))

এর একটি দুর্দান্ত এবং মোটামুটি সহজ উদাহরণ হ'ল নিমের খেলাটির সাধারণ সমাধান। উইকিপিডিয়া পৃষ্ঠায় পাইথন কোডটি একবার দেখুন । এটি বিটওয়াইজ একচেটিয়া বা, এর ভারী ব্যবহার করে ।^


1

অ্যারের উপাদান দুটি মানের মধ্যে কোথায় রয়েছে তার সন্ধানের জন্য আরও ভাল উপায় হতে পারে, তবে এই উদাহরণটি দেখায় যে, & এখানে কাজ করে, যেখানে আছে এবং তা করে না।

import numpy as np
a=np.array([1.2, 2.3, 3.4])
np.where((a>2) and (a<3))      
#Result: Value Error
np.where((a>2) & (a<3))
#Result: (array([1]),)

1

আমি এটি উল্লিখিত দেখতে পাইনি, এই উদাহরণটি আপনাকে 2 বিট মানগুলির জন্য (-) দশমিক অপারেশন প্রদর্শন করবে: এবি (কেবলমাত্র যদি বিতে বি রয়েছে)

এই ক্রিয়াকলাপটি তখন প্রয়োজন যখন আমরা আমাদের প্রোগ্রামে একটি ক্রিয়া ধরে রাখি যা বিটগুলি উপস্থাপন করে। কখনও কখনও আমাদের বিট যোগ করতে হবে (উপরের মতো) এবং কখনও কখনও আমাদের বিটগুলি অপসারণ করতে হবে (ক্রিয়াপদে থাকে তবে)

111 #decimal 7
-
100 #decimal 4
--------------
011 #decimal 3

অজগর সহ: 7 এবং ~ 4 = 3 (4 টি উপস্থাপন করে 7 বিট থেকে সরান)

001 #decimal 1
-
100 #decimal 4
--------------
001 #decimal 1

অজগর সহ: 1 & ~ 4 = 1 (4 টি উপস্থাপন করে 1 টি থেকে সরান - এই ক্ষেত্রে 1 '' থাকে না 4) ..


0

যখন কোনও পূর্ণসংখ্যার বিটগুলি পরিচালনা করতে দরকারী, প্রায়শই নেটওয়ার্ক প্রোটোকলগুলির জন্য, যা বিটটিতে নির্দিষ্ট করা যেতে পারে, তার জন্য লম্বা বাইট সিকোয়েন্সগুলির হেরফের প্রয়োজন হতে পারে (যা সহজেই একটি পূর্ণসংখ্যায় রূপান্তরিত হয় না)। এক্ষেত্রে বিটস্ট্রিং লাইব্রেরি নিয়োগ করা দরকারী যা ডেটাতে বিটওয়াইজ অপারেশনের জন্য অনুমতি দেয় - উদাহরণস্বরূপ স্ট্রিং হিসাবে 'ABCDEFGHIJKLMNOPQ' স্ট্রিং আমদানি করতে পারেন এবং হেক্স এবং বিট শিফট হিসাবে (বা অন্যান্য বিটওয়াইজ অপারেশন সম্পাদন করতে পারেন):

>>> import bitstring
>>> bitstring.BitArray(bytes='ABCDEFGHIJKLMNOPQ') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')
>>> bitstring.BitArray(hex='0x4142434445464748494a4b4c4d4e4f5051') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')

0

নিম্নলিখিত বিটওয়াইস অপারেটরগুলি: & , | , ^ , এবং ~ ফেরতের মানগুলি (তাদের ইনপুটের ভিত্তিতে) একইভাবে যুক্তি গেটগুলি সংকেতগুলিকে প্রভাবিত করে। আপনি এগুলি সার্কিট অনুকরণ করতে ব্যবহার করতে পারেন।


0

বিটগুলি ফ্লিপ করতে (যেমন 1 এর পরিপূরক / বিপরীত) আপনি নিম্নলিখিতটি করতে পারেন:

যেহেতু সমস্ত 1 এর সাথে মূল্য এক্সওরড হয় ফলাফলকে বিপরীতে পরিণত হয়, প্রদত্ত বিট প্রস্থের জন্য আপনি এগুলি উল্টাতে এক্সওর ব্যবহার করতে পারেন।

In Binary
a=1010 --> this is 0xA or decimal 10
then 
c = 1111 ^ a = 0101 --> this is 0xF or decimal 15
-----------------
In Python
a=10
b=15
c = a ^ b --> 0101
print(bin(c)) # gives '0b101'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.