বিটওয়াইজ অপারেটর কি?


129

আমি এমন কেউ একজন যিনি কেবল মজাদার জন্য কোড লেখেন এবং কোনও একাডেমিক বা পেশাদার সেটিংসে সত্যই তা প্রকাশ করেননি, তাই এই বিটওয়াইজ অপারেটরগুলির মতো জিনিসগুলি সত্যই আমাকে এড়িয়ে যায়।

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

আরও কয়েকটি প্রশ্ন - বিটওয়াইজ অপারেশনগুলির ব্যবহারিক প্রয়োগগুলি কী কী? আপনি কখন তাদের ব্যবহার করতে পারেন?


2
আরও প্রশ্নের জন্য, আপনি একটি নতুন এসও প্রশ্ন যুক্ত করতে চান এবং এটি একটি উল্লেখ করতে পারেন। আপনি সম্ভবত উত্তরের আরও ভাল সেট পাবেন।
গ্রেগ হিউগিল

উত্তর:


186

যেহেতু এগুলি কেন কার্যকর তা নিয়ে কেউই আলোচনা করেননি:

পতাকা নিয়ে কাজ করার সময় আমি বিটওয়াইজ অপারেশনগুলি প্রচুর ব্যবহার করি। উদাহরণস্বরূপ, যদি আপনি কোনও ক্রিয়াকলাপের পতাকাগুলি কোনও ক্রিয়াকলাপে পাস করতে চান (বলুন, File.Open()রিড মোড এবং রাইট মোড উভয় সক্ষম করে) তবে আপনি সেগুলি একক মান হিসাবে পাস করতে পারেন could এটি প্রতিটি সম্ভাব্য পতাকাটি একটি বিটসেটের (বিট, শর্ট, ইনট বা লম্বা) এর নিজস্ব বিট বরাদ্দ করে সম্পন্ন হয়। উদাহরণ স্বরূপ:

 Read: 00000001
Write: 00000010

সুতরাং আপনি যদি পড়তে এবং লিখতে পাস করতে চান তবে আপনি (পুনরায় | লিখন) পাস করবেন যা এরপরে দুটিকে একত্রিত করে

00000011

যা অন্য প্রান্তে যেমন ডিক্রিপ্ট করা যায়:

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

যা চেক করে

00000011 &
00000001

যা ফিরে আসে

00000001

যা 0 নয়, তাই পতাকাটি READ নির্দিষ্ট করে।

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

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

আমি কেবলমাত্র (লেফট | রাইট) দিয়ে বর্তমান মানটি XOR করে যা এই ক্ষেত্রে বামদিক বন্ধ এবং রাইটটি চালু করবে।

বিট শিফটিং বেশ কয়েকটি ক্ষেত্রে কার্যকর।

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

প্রতিটি কলামে বিটগুলির প্রতিটি জোড়া নীচের লাইনে সংশ্লিষ্ট আউটপুট বিট দেওয়ার জন্য "AND" ফাংশনটির মাধ্যমে সঞ্চালিত হয়। সুতরাং উপরের অভিব্যক্তিটির উত্তর 4 The সিপিইউ সমান্তরালভাবে 8 পৃথক "এবং" অপারেশন করেছে, প্রতিটি কলামের জন্য একটি করে।

আমি এটি উল্লেখ করেছি কারণ আমার এখনও এই "আহা" থাকার কথা মনে আছে! এই মুহুর্তটি যখন আমি অনেক বছর আগে এই সম্পর্কে জানতে পারি।


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

27

বিটওয়াইজ অপারেটরগুলি অপারেটর যারা একবারে কিছুটা কাজ করে।

এবং এর উভয় ইনপুট 1 হলেই 1 হয়।

বা এর এক বা একাধিক ইনপুট 1 হলে 1 হয়।

এক্সওআর 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 বা 1 হলে এটি 0 দেয়।

  • ~op1 -- দ্য COMPLEMENT অপারেটরের সমস্ত বিট উল্টাতে অপারেটর ব্যবহার করা হয়।

  • op1 << op2 -- দ্য SHIFT LEFT অপারেটর বিটগুলি বাম দিকে সরায়, ডানদিকের বাম বিটটি বিছিন্ন করে এবং ডানদিকের বিটটিকে 0 এর মান নির্ধারণ করে the

  • op1 >> op2 -- দ্য SHIFT RIGHT অপারেটর বিটটি ডানদিকে সরায়, ডানদিকের বিটটি বিছিন্ন করে এবং বাম দিকের বিটটিকে 0 এর মান নির্ধারণ করে Each ডানদিকে প্রতিটি পদক্ষেপ কার্যকরভাবে অর্ধেক অংশে op1 বিভক্ত করে। বাম-সর্বাধিক সাইন বিট সংরক্ষণ করা হয়েছে।

  • op1 >>> op2- SHIFT RIGHT- ZERO FILLঅপারেটর ডানে বিট চলে পরিত্যাগ পর্যন্ত ডান বিট এবং নির্ধারণ বামদিকের অধিকার কার্যকরভাবে ভাগ প্রতিটি পদক্ষেপ অর্ধেক op1 0. মান বিট। বাম-সর্বাধিক চিহ্ন বিট বাতিল করা হয়েছে।


"বিট যদি পরিপূরক হয়" - ওয়াহ্ট?
আন্দ্রে টিউকিন

@ আন্ড্রেইউইকিন দুটি বিট পরিপূরক হলে এর মধ্যে একটি 1 এবং অন্যটি 0 হয়
জেফ হিলম্যান

@ জেফহিলম্যান মন্তব্যে আপনার বিবরণ অনুসারে, 1 এবং 1 "পরিপূরক" নয়। তারপরে আমার কাছে এটি স্পষ্ট নয় যে কেন 1 | 1দেয় 1এবং না দেয় 0এবং কীভাবে |তার থেকে আলাদা হওয়ার কথা ^। আমাকে এই প্রশ্নোত্তরটি ডুপ্লিকেট টার্গেট হিসাবে কয়েক দিন আগে ব্যবহার করতে হয়েছিল এবং আমি চেয়েছিলাম যে 10 বছর পরে এই ধরণের প্রশ্নের জন্য একটি পরিষ্কার ক্যানোনিকাল সদৃশ হবে have
আন্দ্রে টিউকিন

4

এটি আরও কিছুটা ভাঙতে, এটিতে প্রশ্নের মধ্যে বাইনারি উপস্থাপনের সাথে অনেক কিছু আছে।

উদাহরণস্বরূপ (দশমিক মধ্যে):
x = 8
y = 1

(বাইনারি) এ বেরিয়ে আসত:
x = 1000
y = 0001

সেখান থেকে আপনি গণনামূলক ক্রিয়াকলাপ যেমন 'এবং' বা 'বা' করতে পারেন; এক্ষেত্রে:
এক্স | y =
1000 
0001 |
------
1001

বা ... 9 দশমিক

আশাকরি এটা সাহায্য করবে.


|একটি ওআর অপারেশন হয়?
Si8

কিছু কারণে এটি আমার কাছে সবচেয়ে বেশি উপলব্ধি করেছে। x | y = 1000 0001 |অংশটি সম্পর্কে এখনও নিশ্চিত না
সামায়ো

4

যখন "বিটওয়াইজ" শব্দটি উল্লেখ করা হয়, এটি মাঝে মাঝে পরিষ্কার করে দেয় যে "যৌক্তিক" অপারেটর নয়।

জাভাস্ক্রিপ্টে উদাহরণস্বরূপ, বিটওয়াইস অপারেটরগুলি তাদের অপারেন্ডগুলিকে 32 বিটের ক্রম হিসাবে বিবেচনা করে (জিরো এবং একটি) ; ইতিমধ্যে লজিকাল অপারেটরগুলি সাধারণত বুলিয়ান (যৌক্তিক) মানগুলির সাথে ব্যবহৃত হয় তবে নন-বুলিয়ান প্রকারের সাথে কাজ করতে পারে।

উদাহরণস্বরূপ expr1 এবং& Expr2 নিন।

যদি এটি মিথ্যাতে রূপান্তর করা যায় তবে এক্সপ্রেস 1 প্রদান করে; অন্যথায়, expr2 প্রদান করে। সুতরাং, যখন বুলিয়ান মানগুলির সাথে ব্যবহৃত হয়, এবং & উভয় ক্রিয়াকলাপ সত্য হয় তবে সত্য ফিরে আসে; অন্যথায়, মিথ্যা প্রত্যাবর্তন।

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

অন্যরা যেমন উল্লেখ করেছে, 2 এবং 4 কিছুটা বিপরীত এবং এর, সুতরাং এটি 0 এ ফিরে আসবে।

আপনি নিম্নলিখিত পরীক্ষাগুলি html বা কিছুতে এবং অনুলিপি করতে পারেন:

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

3

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

কার্যক্রম :

  • বিটওয়াইড এবং

  • বিটওয়াইজ ও

  • বিটওয়াইজ নট

  • বিটওয়াইজ এক্সওআর

  • ইত্যাদি

তালিকাবদ্ধ

    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

বিটওয়াইড অপারেটরের ব্যবহার

  • বাম-শিফট এবং ডান-শিফট অপারেটরগুলি যথাক্রমে x * 2 y দ্বারা গুণ এবং বিভাগের সমান ।

যেমন।

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 ;
}
  • এক্সওআর গেট এনক্রিপশন জনপ্রিয় প্রযুক্তি, কারণ এটির কমপ্লিটটি এবং প্রোগ্রামার দ্বারা পুনরায় ব্যবহারের কারণে।
  • বিটওয়াইজ এক্সওআর অপারেটর প্রযুক্তিগত সাক্ষাত্কারের দৃষ্টিকোণ থেকে সবচেয়ে দরকারী অপারেটর।

বিটওয়াইজ শিফটিং কেবলমাত্র + Ve নম্বর দিয়ে কাজ করে

এছাড়াও বিটওয়াইজ লজিকের বিস্তৃত ব্যবহার রয়েছে


"অভিনন্দন এবং পুনরায় ..."?
জোনাথন ক্রস

The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.সেটা ঠিক! muyiy.cn/question/program/102.html
xgqfrms

আমার সমাধান repl.it/@xgqfrms/…
xgqfrms

1

এটি এটি এইভাবে ভাবতে সহায়তা করতে পারে। এটি (এবং) কীভাবে কাজ করে:

এটি মূলত এই উভয় সংখ্যারই বলে, সুতরাং আপনার যদি দুটি সংখ্যা 5 এবং 3 থাকে তবে তারা বাইনারিতে রূপান্তরিত হবে এবং কম্পিউটারটি ভাববে

         5: 00000101
         3: 00000011

উভয়ই এক: 00000001 0 টি মিথ্যা, 1 টি সত্য

সুতরাং 5 এবং 3 এর AND একটি। ওআর (|) অপারেটর একই জিনিসটি করে কেবলমাত্র দুটি সংখ্যার মধ্যে একটিই আউটপুট 1 হতে হবে, উভয়ই নয়।


-5

আমি জাভাস্ক্রিপ্ট বিটওয়াইজ অপারেটররা কত ধীর ছিল তা শুনছিলাম। আমি আমার সর্বশেষ ব্লগ পোস্টের জন্য কিছু পরীক্ষা করেছি এবং জানতে পেরেছিলাম যে বেশ কয়েকটি পরীক্ষায় সেগুলি গাণিতিক বিকল্পের চেয়ে 40% থেকে 80% দ্রুত ছিল। সম্ভবত তারা ধীর হয়ে যেত। আধুনিক ব্রাউজারগুলিতে, আমি তাদের ভালবাসি।

আমার কোডে আমার একটি মামলা রয়েছে যা এর কারণে পড়তে আরও দ্রুত এবং সহজ হবে। আমি আরও কিছু জন্য চোখ খোলা রাখব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.