কম্পিউটার

রুবিস বিটওয়াইজ টুলবক্স:অপারেটর, অ্যাপ্লিকেশন এবং ম্যাজিক ট্রিকস

আপনি সম্ভবত আপনার সারা জীবন Rails অ্যাপ তৈরিতে ব্যয় করতে পারেন এবং কখনই কোনো বিটওয়াইজ অপারেটর ব্যবহার করতে হবে না। আপনি যদি প্রোগ্রামিংয়ে নতুন হন, তাহলে আপনি হয়তো "বিটওয়াইজ" এর অর্থ কী তা জানেন না।

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

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

যেহেতু রুবি এবং অন্যান্য অনেক ভাষার স্থানীয় সমর্থন রয়েছে, তাই তারা আপনার টুলবক্সে যোগ করার জন্য একটি দুর্দান্ত সরঞ্জাম, এমনকি যদি আপনি ভবিষ্যতে তাদের মুখোমুখি হন তবে কী ঘটছে তা বোঝার জন্য।

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

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

যেকোনো কম্পিউটারে সর্বনিম্ন স্তরে, আমাদের কাছে শুধুমাত্র 1s এবং 0s আছে, যা বিট নামেও পরিচিত। আমরা রুবি বা অন্য কোন প্রোগ্রামিং ভাষায় ব্যবহার করি এমন অন্য যেকোন অপারেশন শেষ পর্যন্ত 1s এবং 0s হিসাবে সংরক্ষিত হয়, কিন্তু আমাদের কম্পিউটারে সফ্টওয়্যারটি আমরা যা দেখি এবং আসলে যা সংরক্ষিত হয় তার মধ্যে কার্যকরভাবে তাদের পরিবর্তন করে। উদাহরণস্বরূপ, আমরা স্ট্রিং "হ্যালো" 1s এবং 0s এর চেইন হিসাবে সংরক্ষণ করি৷

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

আপাতত বিটওয়াইজ অপারেশনগুলি সম্পর্কে হাইলাইট করার জন্য দুটি গুরুত্বপূর্ণ দিক রয়েছে:এগুলি তথ্য সংরক্ষণে অত্যন্ত কার্যকর, যেহেতু আমরা বিটগুলি সরাসরি ব্যবহার করছি এবং সেগুলি কার্যকর করার ক্ষেত্রে খুব দ্রুত৷

মৌলিক আচরণ হল বিটের একটি সেট থাকা এবং এতে অপারেটর প্রয়োগ করা। আপনি দুটি সেট বিট সহ অপারেটরগুলি ব্যবহার করতে পারেন। চলুন কিছু অপারেশন দেখি:

বিটওয়াইজ অপারেশন নয়

এটি একটি unary অপারেশন, যার মানে হল এটি শুধুমাত্র বিটের একটি সেটের ক্ষেত্রে প্রযোজ্য এবং এটি 1s-কে 0s দিয়ে প্রতিস্থাপন করার মতো সহজ এবং এর বিপরীতে। এটিকে প্রতীক দিয়ে উপস্থাপন করা হয়:~ .

~101000 = 010111

এবং বিটওয়াইজ অপারেশন

এবং একটি অপারেশন যা দুটি সেট বিটের ক্ষেত্রে প্রযোজ্য; এর প্রতীক হল & এবং এটি এই যুক্তি অনুসরণ করে:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

সুতরাং যখন আমাদের কাছে দুটি সমান দৈর্ঘ্যের বিট থাকে, ফলাফলটি প্রতিটি পৃথক জোড়ায় এই যুক্তি প্রয়োগ করে:

0110 AND
0111
-----
0110

রুবিতে:

25.to_s(2)           # 11001
30.to_s(2)           # 11110
(25 & 30).to_s(2)    # 11000

বা বিটওয়াইজ অপারেশন

AND অপারেশনের মতো, আরেকটি অপারেশন যা দুটি সেট বিটের ক্ষেত্রেও প্রযোজ্য তা হল বিটওয়াইজ বা। এর প্রতীক হল | এবং এই যুক্তি অনুসরণ করে:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

সুতরাং আমাদের উভয় পাশে 1 থাকলে ফলাফল 1, অন্যথায় এটি 0। খুব সহজ! আসুন আরও বিট সহ একটি OR অপারেশন দেখি:

0110 OR
0111
-----
0111

এবং রুবিতে:

25.to_s(2)           # 11001
30.to_s(2)           # 11110
(25 | 30).to_s(2)    # 11111

ব্যবহারিক উদাহরণ 1:অনুমতি

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

তবে আপনি সম্ভবত আগে অনুমতি নিয়ে কাজ করেছেন। অনুমতি হল এমন একটি ক্ষেত্র যেখানে বিটওয়াইজ অপারেশনগুলি সত্যিই কার্যকর হতে পারে। কল্পনা করুন আপনার কাছে একটি অনুমতি সিস্টেম আছে যেখানে ব্যবহারকারীরা একটি নথিতে বিভিন্ন ক্রিয়া সম্পাদন করতে পারে:

  • দেখুন
  • সম্পাদনা করুন
  • মুছুন
  • অন্যান্য ব্যবহারকারীদের আমন্ত্রণ জানান

এবং এখন আমরা এই ক্রিয়াগুলিকে বিভিন্ন ভূমিকায় মডেল করতে চাই:

  • সহকারী: দস্তাবেজটি দেখতে এবং সম্পাদনা করতে পারেন৷
  • পর্যবেক্ষক: শুধুমাত্র ডকুমেন্ট দেখতে পারেন।
  • লেখক: সকল কর্ম সম্পাদন করতে পারে।

কিভাবে আমরা এই মডেল করতে পারে? একজন ব্যবহারকারীর যদি এই ভূমিকাগুলির মধ্যে একটি থাকে তবে আমরা কীভাবে জানতে পারি? একটি উত্তর হল বিটওয়াইজ অপারেশন ব্যবহার করা।

আমরা প্রতিটি ব্যবহারকারীর জন্য বিটগুলির একটি মাত্র সেট সংরক্ষণ করব যা তাদের কাছে থাকা অনুমতিগুলিকে উপস্থাপন করে:

(Starting from the right side)
1st bit: View
2nd bit: Edit
3rd bit: Delete
4th bit: Invite other users

যেমনঃ

0001 = Can only view the document.
0011 = Can view and edit the document.
1001 = Can view, can't edit, can't delete and can invite others.

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

# This is called a bit mask. It contains only the value we want to check, in this case the second bit for editing.
EDIT_PERMISSION_MASK = 0b0010

# We can define a quick method to check this: 
def can_edit_document?(user_permisions)
  (EDIT_PERMISSION_MASK & user_permisions) != 0
end

এর মানে হল যে যদি বিটওয়াইজ এবং অপারেশন আমাদেরকে 0 থেকে আলাদা কিছু দেয়, তাহলে আমাদের সেই বিট সেট আছে:

0010 AND
1101
----
0000 == 0 so we don't have the permission

0010 AND
1110
----
0010 != 0 so we have the permission

আমরা যে বিটটি পরীক্ষা করতে চাই সেটির অবস্থান পরিবর্তন করে আমরা অন্য যেকোনো অনুমতিতে একই যুক্তি প্রয়োগ করতে পারি, তাই আমরা এই ধ্রুবক এবং সংশ্লিষ্ট পদ্ধতিগুলির সাথে শেষ করব:

VIEW_PERMISSION_MASK   = 0b0001
EDIT_PERMISSION_MASK   = 0b0010
DELETE_PERMISSION_MASK = 0b0100
INVITE_PERMISSION_MASK = 0b1000

উপরন্তু, আমরা গতিশীলভাবে অনুমতি সংজ্ঞায়িত করতে পারি এবং একটি দ্রুত বিট চেক করে ভবিষ্যতে নতুন অনুমতি সংরক্ষণ করতে পারি।

উদাহরণস্বরূপ, আমরা আগে বলেছিলাম যে একজন সহকারী শুধুমাত্র নথিটি দেখতে এবং সম্পাদনা করতে পারে, তাই সেই ব্যবহারকারীর জন্য অনুমতিগুলি হবে:0011 . আমরা সেই মানটি আমাদের ডাটাবেসে সংরক্ষণ করতে পারি এবং তারপরে আমরা সহজেই পরীক্ষা করতে পারি যে একজন সহকারী আগে সংজ্ঞায়িত পদ্ধতিগুলির সাথে একটি কাজ সম্পাদন করতে পারে কিনা৷

ASSISTANT_MASK = VIEW_PERMISSION_MASK | EDIT_PERMISSION_MASK
# This will be: 0011

# Optionally, we could use this method to check if this user is an assistant. This method could be defined inside the User class.
def is_assistant?(user)
  (user.permissions == ASSISTANT_MASK)
end

যদি এই সবগুলি পরিচিত মনে হয়, তবে এটি একই পদ্ধতি যা সাধারণত ইউনিক্স-ভিত্তিক সিস্টেমে ফাইলের অনুমতির জন্য ব্যবহৃত হয়।

ব্যবহারিক উদাহরণ 2:একটি দলে অবস্থান

আসুন একটু বেশি বিটওয়াইজ অপারেশন ব্যবহার করি 😉।

আমরা সেগুলিকে তুলনামূলকভাবে সাধারণ অন্য ক্ষেত্রে প্রয়োগ করতে পারি:একটি স্পোর্টস টিমের বিভিন্ন অবস্থান বা একটি কোম্পানিতে চাকরির অবস্থান। সরলীকরণ করতে একটি বাস্কেটবল দলের সাথে যান।

বাস্কেটবলে, একটি খেলা খেলার সময় 5টি অবস্থান থাকে:- পয়েন্ট গার্ড- শ্যুটিং গার্ড- ছোট ফরোয়ার্ড- পাওয়ার ফরোয়ার্ড- সেন্টার

এবং আমরা প্রতিটি অবস্থানে বিটের একটি সেট বরাদ্দ করতে পারি: 00001 Point guard 00010 Shooting guard 00100 Small forward 01000 Power forward 10000 Center

রুবিতে একই রকম হবে:

POINT_GUARD_POSITION    = 0b00001
SHOOTING_GUARD_POSITION = 0b00010
SMALL_FORWARD_POSITION  = 0b00100
POWER_FORWARD_POSITION  = 0b01000
CENTER_POSITION         = 0b10000

POINT_GUARD_POSITION | SHOOTING_GUARD_POSITION | SMALL_FORWARD_POSITION | POWER_FORWARD_POSITION | CENTER_POSITION # = 31

তাই এখন আমরা কিছু আকর্ষণীয় জিনিস করতে পারি, যেমন পুরো টিম এর সাথে উপস্থিত আছে কিনা তা পরীক্ষা করুন:

# p1...p5 are the positions of each player
is_full_team_present = (p1 | p2 | p3 | p4 | p5 == 31)

কেন? বিটওয়াইজ বা অপারেশন করার মাধ্যমে, আমাদের যদি সব পজিশন থাকে, তাহলে আমরা শেষ হতাম:11111।

# OR bitwise operation
00001 |
00010 |
00100 |
01000 |
10000
-----
11111

এবং 11111 হল 31, কারণ 2^0 + 2^1 + 2^2 + 2^3 + 2^4 =31।

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

def can_be_exchanged?(player1, player2)
  player1.position == player2.position
end

XOR

আরেকটি অপারেশন যা আমরা দুই সেট বিট দিয়ে করতে পারি তা হল XOR, যার প্রতীক হল ^ .

XOR মানে একচেটিয়া OR এবং এটি এই যুক্তি অনুসরণ করে:

1 | 1 = 0
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

সুতরাং ফলাফল 1 হবে শুধুমাত্র যদি দুটি বিটের একটি 1 হয়; উভয়ই সমান হলে 0 হবে।

এই ক্রিয়াকলাপটি কিছু অ্যালগরিদমে একটি সংখ্যার সাথে তুলনা করতে ব্যবহৃত হয়, যেহেতু x^x =0।

Shifts

এটি ক্রিয়াকলাপের একটি আকর্ষণীয় গ্রুপ যেখানে আমরা একটি সেটের মধ্যে একপাশে বা অন্য দিকে বিটগুলিকে "সরানো" করি। আমাকে ব্যাখ্যা করতে দাও.

বিট শিফটের সাথে, আমরা বিটগুলিকে বাম বা ডানে এক দিকে সরান বা "নাড়ান" করি:

00010111 left-shift
<-------
00101110
10010111 right-shift
------->
11001011

আমরা বিট n বার সরাতে বা স্থানান্তর করতে পারি। এখানে রুবিতে 5 নম্বরে দুবার প্রয়োগ করা হয়েছে একটি বাম স্থানান্তর:

5.to_s(2) # 101
(5 << 2).to_s(2) # 10100

আপনি দেখতে পাচ্ছেন, একটি বাম স্থানান্তর <<দ্বারা প্রতিনিধিত্ব করা হয়। একটি ডান স্থানান্তর ব্যবহার করে>>:

5.to_s(2) # 101
(5 >> 2).to_s(2) # 1

এই ক্ষেত্রে, আমরা শুধুমাত্র একটি পাই, কারণ 1*01 থেকে বিট "0" এবং "1" * বাতিল করা হয়েছে।

ডান শিফট দিয়ে 2 দিয়ে ভাগ করুন

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

যদি আমরা একটি সংখ্যায় একটি ডান স্থানান্তর প্রয়োগ করি, তাহলে আমরা এটিকে 2 দ্বারা ভাগ করার ফলাফল পাই:

10.to_s(2)        # 1010
(10 >> 1).to_s(2) # 101
10 >> 1           # 5

বাম শিফট দিয়ে 2 দ্বারা গুণ করুন

একই পদ্ধতিতে, আমরা একটি বাম শিফট দিয়ে 2 দ্বারা গুণ করতে পারি:

10.to_s(2)        # 1010
(10 << 1).to_s(2) # 10100
10 << 1           # 20

একটি সংখ্যা বিজোড় বা জোড় কিনা তা দ্রুত পরীক্ষা করুন

একটি বিটওয়াইজ অপারেশনের একটি খুব সাধারণ উদাহরণ রয়েছে যা সত্যিই দ্রুত এবং অনুসরণ করা সহজ৷

কল্পনা করুন যে আমরা 1 দিয়ে একটি AND অপারেশন করি, মাত্র 1। সুতরাং আমরা যে কম্পিউটারে আছি তার উপর নির্ভর করে এটি 0 সেকেন্ডের যেকোনো সংখ্যা হবে, এবং 1। আসুন এটি 2 দিয়ে করি:

2 = 00000010 &
    00000001
-------------
    00000000

এখন 4:

এর সাথে
4 = 00000100 &
    00000001
-------------
    00000000

5 সম্পর্কে কি?

5 = 00000101 &
    00000001
-------------
    00000001

এখন আমরা 1 পেয়েছি। আপনি কি অনুমান করতে পারেন এর অর্থ কী?

এটি করে এবং 1 দিয়ে, সংখ্যাটি জোড় হলে, আমরা 0 পাব। যদি এটি বিজোড় হয়, তাহলে আমরা 1 পাব। আমরা রুবিতে কয়েকটি পদ্ধতি তৈরি করতে এই সত্যটি সহজেই ব্যবহার করতে পারি:

def is_odd?(number)
  number & 1
end
def is_even?(number)
  is_odd?(number) == 0
end
# Or:
def is_even?(number)
  (number & 1) == 0
end

আপনি যদি আরও এগিয়ে যেতে চান, বা বিটগুলির সাথে কিছু মন ফুঁকানোর মুহূর্তগুলি অনুভব করতে চান, আরও কৌশলের জন্য এই বিটওয়াইজ হ্যাকস সংগ্রহটি দেখুন৷

উপসংহার

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


  1. পাইথন বিটওয়াইজ অপারেটর

  2. উইন্ডোজ 10 টিপস এবং ট্রিকস

  3. উইন্ডোজ 10 টিপস এবং ট্রিকস

  4. অ্যাপলের ম্যাজিক মাউস ব্যবহার করার জন্য টিপস এবং কৌশল