নিম্নলিখিত বিটওয়াইস অপারেটরগুলির কিছু বাস্তব বিশ্ব ব্যবহারের কেস?
- এবং
- XOR যাও
- না
- অথবা
- বাম / ডান স্থানান্তর
নিম্নলিখিত বিটওয়াইস অপারেটরগুলির কিছু বাস্তব বিশ্ব ব্যবহারের কেস?
উত্তর:
বিট ক্ষেত্র (পতাকা)
তারা এমন কিছু উপস্থাপনের সবচেয়ে কার্যকরী উপায় যার রাজ্যটি বেশ কয়েকটি "হ্যাঁ বা না" বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়। এসিএল একটি ভাল উদাহরণ; যদি আপনার 4 টি স্বতন্ত্র অনুমতি (পড়ুন, লিখুন, সম্পাদন করুন, নীতি পরিবর্তন করুন) বলুন তবে এটি 4 টি বর্জ্যের চেয়ে 1 বাইটে সংরক্ষণ করা ভাল These এগুলি অতিরিক্ত সুবিধার জন্য বহু ভাষায় গণনার প্রকারে ম্যাপ করা যেতে পারে।
বন্দর / সকেটের মাধ্যমে যোগাযোগের
ক্ষেত্রে সর্বদা চেকসাম, সমতা, বিট স্টপ বিট, প্রবাহ নিয়ন্ত্রণ অ্যালগোরিদম এবং এর সাথে জড়িত থাকে যা সাধারণত পৃথক বাইটের যুক্তিযুক্ত মানগুলির উপর নির্ভর করে সংখ্যাসূচক মানগুলির বিপরীতে, কারণ মাধ্যমটি কেবলমাত্র একটি বিট প্রেরণ করতে সক্ষম হতে পারে একটি সময়.
সংক্ষিপ্তকরণ, এনক্রিপশন
উভয়ই বিটওয়াইজ অ্যালগরিদমের উপর নির্ভরশীল। উদাহরণস্বরূপ ডিফল্ট অ্যালগরিদমটি দেখুন - সমস্ত কিছু বিটগুলিতে হয়, বাইট নয়।
ফাইনাইট স্টেট মেশিনগুলি
আমি প্রাথমিকভাবে কিছু ধরণের হার্ডওয়্যার এম্বেড করা ধরনেরটির কথা বলছি, যদিও সেগুলি সফ্টওয়্যারটিতেও পাওয়া যায়। এই প্রকৃতির সংযুক্তিকরণ - তারা আক্ষরিক পেয়ে পারে হবে "কম্পাইল" নিচে লজিক গেটের একটি গুচ্ছ, তাই তারা হিসাবে প্রকাশ করতে হবে AND
, OR
, NOT
, ইত্যাদি
গ্রাফিক্স
এই অপারেটরগুলি গ্রাফিক্স প্রোগ্রামিংয়ে ব্যবহৃত হয় এমন প্রতিটি অঞ্চলে প্রবেশের জন্য এখানে খুব কমই জায়গা রয়েছে space XOR
(বা ^
) এখানে বিশেষ আকর্ষণীয় কারণ একই বার দ্বিতীয় বার প্রয়োগ করা প্রথমটিকে পূর্বাবস্থায় ফিরিয়ে আনবে। পুরানো জিইউআইগুলি ব্যয়বহুল পুনর্নির্মাণের প্রয়োজনীয়তা অপসারণের জন্য বাছাই হাইলাইটিং এবং অন্যান্য ওভারলেগুলির জন্য এটির উপর নির্ভর করে। এগুলি এখনও ধীর গ্রাফিক্স প্রোটোকলগুলিতে (যেমন দূরবর্তী ডেস্কটপ) কার্যকর।
এগুলি আমি প্রথম কয়েকটি উদাহরণ নিয়ে এসেছি - এটি খুব কমই একটি সম্পূর্ণ তালিকা।
এটা কি অদ্ভুত?
(value & 0x1) > 0
এটি কি দুটি (এমনকি) দ্বারা বিভাজ্য?
(value & 0x1) == 0
পৃথক বিট হিসাবে সঞ্চিত পতাকাগুলি নিয়ে কাজ করার জন্য এখানে কিছু সাধারণ আইডিয়াম রয়েছে।
enum CDRIndicators {
Local = 1 << 0,
External = 1 << 1,
CallerIDMissing = 1 << 2,
Chargeable = 1 << 3
};
unsigned int flags = 0;
চার্জযোগ্য পতাকা সেট করুন:
flags |= Chargeable;
CallerID মিসিং পতাকা সাফ করুন:
flags &= ~CallerIDMissing;
CallerIDMissing এবং চার্জযোগ্য সেট আছে কিনা তা পরীক্ষা করুন:
if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {
}
আমি একটি সিএমএসের জন্য সুরক্ষা মডেল বাস্তবায়নে বিটওয়াইজ অপারেশনগুলি ব্যবহার করেছি। এটিতে এমন পৃষ্ঠা রয়েছে যা ব্যবহারকারীরা উপযুক্ত গ্রুপে থাকলে অ্যাক্সেস করতে পারে। কোনও ব্যবহারকারী একাধিক গ্রুপে থাকতে পারে, তাই আমাদের ব্যবহারকারী গ্রুপ এবং পৃষ্ঠাগুলির মধ্যে একটি ছেদ করেছে কিনা তা আমাদের খতিয়ে দেখা উচিত। সুতরাং আমরা প্রতিটি গোষ্ঠীকে একটি অনন্য পাওয়ার-অফ -2 সনাক্তকারী নির্ধারণ করেছি, যেমন:
Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100
আমরা বা এই মানগুলি একসাথে করি এবং পৃষ্ঠাটির সাথে মানটি (একক int হিসাবে) সঞ্চয় করি। উদাহরণস্বরূপ, যদি কোনও পৃষ্ঠা A & B গ্রুপ দ্বারা অ্যাক্সেস করা যায়, তবে পৃষ্ঠা 3 অ্যাক্সেস নিয়ন্ত্রণ হিসাবে আমরা মান 3 (যা বাইনারিতে 00000011 হয়) সংরক্ষণ করি। অনেক একইভাবে, আমরা কোন গ্রুপে রয়েছে সেগুলি উপস্থাপনের জন্য একটি ব্যবহারকারীদের সাথে ওআরইডি গ্রুপ শনাক্তকারীদের একটি মান সংরক্ষণ করি।
সুতরাং কোনও প্রদত্ত ব্যবহারকারী কোনও প্রদত্ত পৃষ্ঠায় অ্যাক্সেস করতে পারে কিনা তা পরীক্ষা করতে আপনাকে কেবল মানগুলি এবং মানগুলি একসাথে করতে হবে এবং মানটি শূন্য নয় কিনা তা পরীক্ষা করতে হবে। এটি খুব দ্রুত কারণ এই চেকটি একটি একক নির্দেশনায় কার্যকর করা হয়, কোনও লুপিং নেই, কোনও ডাটাবেস রাউন্ড-ট্রিপস নেই।
নিম্ন-স্তরের প্রোগ্রামিং একটি ভাল উদাহরণ। উদাহরণস্বরূপ, কিছু হার্ডওয়্যার আপনি যা করতে চান তা করতে মেমরি-ম্যাপযুক্ত রেজিস্ট্রারে আপনাকে একটি নির্দিষ্ট বিট লিখতে হবে:
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))
htons()
এবং হোস্ট ( ) এন্ডিয়েননেস থেকে নেটওয়ার্ক ( ) বাইট ক্রমে htonl()
একটি short
বা একটি অদলবদল করার জন্য পসিক্স ফাংশন । long
h
n
htonl()
একটি 32 বিট জন্য int
মূল্য কত? long
বিভিন্ন ভাষায় 64৪-বিট মানে।
উদাহরণস্বরূপ, প্যাকড রঙের মূল্যগুলি থেকে আরজিবি (এ) মান পেতে আমি এগুলি ব্যবহার করি।
(a & b) >> c
চেয়ে 5 গুণ বেশি a % d / e
গতিযুক্ত (এআরজিবি প্রতিনিধিত্বকারী কোনও ইন্টি থেকে একক রঙের মান বের করার উভয় উপায়)। সম্মিলিতভাবে, 1 বিলিয়ন পুনরাবৃত্তির জন্য 6.7 এবং 35.2 গুলি।
%
মডুলাস অপারেটর নয়, এটি রিমাইন্ডার অপারেটর। এগুলি ইতিবাচক মানের জন্য সমান তবে নেতিবাচক মানগুলির সাথে পৃথক। আপনি যদি যথাযথ বিধিনিষেধ সরবরাহ করেন ( উদাহরণস্বরূপ uint
পরিবর্তে একটি পাস int
) তবে দুটি উদাহরণ একই গতি হওয়া উচিত।
যখন আমার কাছে বুলেটিয়ান পতাকা রয়েছে তখন আমি সেগুলি সমস্তগুলিতে সংরক্ষণ করতে চাই।
আমি বিটওয়াইস-ও্যান্ড ব্যবহার করে সেগুলি পেয়েছি। উদাহরণ স্বরূপ:
int flags;
if (flags & 0x10) {
// Turn this feature on.
}
if (flags & 0x08) {
// Turn a second feature on.
}
প্রভৃতি
if (flags.feature_one_is_one) { // turn on feature }
। এটি এএনএসআই সি স্ট্যান্ডার্ডে রয়েছে, সুতরাং বহনযোগ্যতার বিষয়টি হওয়া উচিত নয়।
& = এবং:
নির্দিষ্ট বিটগুলি মাস্ক করুন।
আপনি নির্দিষ্ট বিটগুলি সংজ্ঞায়িত করছেন যা প্রদর্শিত বা প্রদর্শিত হবে না। 0x0 & x বাইটে সমস্ত বিট সাফ করবে যখন 0xFF এক্স পরিবর্তন করবে না। 0x0F নিম্ন স্তনের মধ্যে বিট প্রদর্শন করবে।
রূপান্তর:
সংক্ষিপ্ত পরিবর্তনশীলকে বিট পরিচয়ের সাথে দীর্ঘায়িত করতে বিটগুলি সামঞ্জস্য করা প্রয়োজন কারণ -1 ইনট্রে 0xFFFFFFFF হয় যখন -1 দীর্ঘায়িত 0xFFFFFFFFFFFFFF হয়। পরিচয় সংরক্ষণে আপনি রূপান্তরের পরে একটি মুখোশ প্রয়োগ করেন।
| = অথবা
বিট সেট করুন। বিটগুলি ইতিমধ্যে সেট করা থাকলে নির্লিপ্তভাবে সেট করা হবে। অনেক ডেটাস্ট্রাকচার (বিটফিল্ড) এর আইএসএএসএসইএসটি = 0, আইএস_ভিএসইটি = 1 এর মতো পতাকা থাকে যা নির্দ্বিধায় সেট করা যায়। পতাকাগুলি সেট করতে, আপনি IS_HSET প্রয়োগ করুন আইএস_ভিএসইটি (সি এবং অ্যাসেমব্লিতে এটি পড়ার পক্ষে খুব সুবিধাজনক)
X = এক্সওর
বিটগুলি একই বা ভিন্ন are
~ =
বিটগুলি ফ্লিপ করবেন না ।
এটি প্রদর্শিত হতে পারে যে সমস্ত সম্ভাব্য লোকাল বিট অপারেশনগুলি এই অপারেশনগুলির দ্বারা প্রয়োগ করা যেতে পারে। সুতরাং আপনি যদি পছন্দ করেন তবে বিট ক্রিয়াকলাপের মাধ্যমে একটি ADD নির্দেশনা বাস্তবায়ন করতে পারেন।
কিছু দুর্দান্ত হ্যাকস:
http://www.ugcs.caltech.edu/~wnoise/base2.html
http://www.jjj.de/bitwizardry/bitwizardrypage.html
= ~
, না |=
, যা ওআর।
& = AND
- আমি কেন সমস্ত বিটগুলি সাফ করতে চাই, কেন আমি বাইটের একটি অপরিবর্তিত সংস্করণ পেতে চাই এবং নীচের নীচলে আমি কী করব?
xor
এটি নিজেই। আমি নীচের নীচটি বের করতে চাইলে বেশ কয়েকটি কারণ সম্পর্কে ভাবতে পারি। বিশেষত যদি সেই নিম্ন স্তনবৃন্ত কোনও ডেটা স্ট্রাকচারের অংশ হয় এবং আপনি এটি একটি মুখোশ হিসাবে ব্যবহার করতে চান বা OR
এটি অন্য স্ট্রাক্ট সহ।
এনক্রিপশন সমস্ত বিটওয়াইজ অপারেশন।
আপনি এটিকে ডেটা হ্যাশ করার দ্রুত এবং নোংরা উপায় হিসাবে ব্যবহার করতে পারেন।
int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;
বাইট ফর্ম্যাটে বিটম্যাপ চিত্র থেকে রঙগুলি পড়ার এটি উদাহরণ example
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.
আমি আশা করি এই ক্ষুদ্র উদাহরণগুলি সাহায্য করবে ....
আজকের আধুনিক ভাষার বিমূর্ত বিশ্বে খুব বেশি কিছু নেই। ফাইল আইও একটি সহজ যা মনে আসে, যদিও এটি ইতিমধ্যে কার্যকর করা কিছুতে বিটওয়াইজ অপারেশন অনুশীলন করে এবং বিটওয়াইজ অপারেশন ব্যবহার করে এমন কিছু বাস্তবায়ন করছে না। তবুও, একটি সহজ উদাহরণ হিসাবে, এই কোডটি কোনও ফাইলের পঠনযোগ্য বৈশিষ্ট্য (যাতে এটি একটি নতুন ফাইলস্ট্রিম নির্দিষ্ট করে ফাইলমোড.ক্রিয়েট দিয়ে ব্যবহার করা যেতে পারে) মুছে ফেলাতে প্রদর্শিত হয়: #
//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);
}
কাস্টম বাস্তবায়ন হিসাবে, এখানে একটি সাম্প্রতিক উদাহরণ: আমি আমাদের বিতরণ অ্যাপ্লিকেশনটির অন্য একটি ইনস্টলেশন থেকে সুরক্ষিত বার্তা প্রেরণের জন্য একটি "বার্তা কেন্দ্র" তৈরি করেছি। মূলত, এটি ইমেলের সাথে সাদৃশ্যপূর্ণ, ইনবক্স, আউটবক্স, প্রেরিত ইত্যাদির সাথে সম্পূর্ণ, তবে এটি পঠন প্রাপ্তিগুলির সাথে বিতরণের গ্যারান্টিযুক্তও রয়েছে, সুতরাং "ইনবক্স" এবং "প্রেরিত" এর বাইরে অতিরিক্ত সাবফোল্ডার রয়েছে। এটি যা ছিল তা হ'ল "ইনবক্সে" বা "প্রেরিত ফোল্ডারে কী" তা সাধারণভাবে সংজ্ঞা দেওয়ার জন্য আমার প্রয়োজন ছিল। প্রেরিত ফোল্ডারটির মধ্যে আমার জানতে হবে কী পড়ে এবং কী অপঠিত। অপঠিত কোনটি সম্পর্কে, আমার জানতে হবে কী প্রাপ্ত হয়েছে এবং কী পাওয়া যায় নি। আমি এই তথ্যটি একটি গতিশীল তৈরি করতে ব্যবহার করি যেখানে এমন একটি ধারা যেখানে কোনও স্থানীয় ডাটাসোর্স ফিল্টার করে এবং উপযুক্ত তথ্য প্রদর্শন করে lays
এনামগুলি কীভাবে একসাথে রাখা হয় তা এখানে:
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
}
আপনি কি দেখেন যে এটি কি করে? ইনবাউন্ডমেমোস, "ইনবক্স" এনাম মান দিয়ে এবং (এবং) দ্বারা আমি জানি যে ইনবাউন্ডমেমোসফোর্ডমাইআর্ডার্স ইনবক্সে রয়েছে।
এখানে পদ্ধতির একটি সেদ্ধ ডাউন সংস্করণ যা বর্তমানে নির্বাচিত ফোল্ডারের জন্য একটি দৃশ্যের সংজ্ঞা দেয় এমন ফিল্টারটি তৈরি করে এবং ফেরত দেয়:
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;
}
অত্যন্ত সহজ, তবে বিমূর্ততার স্তরে একটি ঝরঝরে বাস্তবায়ন যা সাধারণত বিটওয়াইজ অপারেশনগুলির প্রয়োজন হয় না।
বেস 64 এনকোডিং একটি উদাহরণ। বেস 64 এনকোডিং ইমেল সিস্টেমের (এবং অন্যান্য উদ্দেশ্যে) প্রেরণের জন্য বাইনারি ডেটা প্রিন্টযোগ্য অক্ষর হিসাবে উপস্থাপন করতে ব্যবহৃত হয়। বেস 64 এনকোডিং 8 বিট বাইটের একটি সিরিজকে 6 বিট চরিত্রের অনুসন্ধান সূচকে রূপান্তর করে। বেস 64, এনকোডিং এবং ডিকোডিংয়ের জন্য প্রয়োজনীয় বিট ক্রিয়াকলাপগুলি বাস্তবায়নের জন্য বিট অপারেশন, শিফটিং, এবং'িং, বা 'নাং করা খুব কার্যকর।
এটি অবশ্যই অগণিত উদাহরণগুলির মধ্যে 1 টি।
আমি অবাক হয়েছি যে কেউ ইন্টারনেট বয়সের সুস্পষ্ট উত্তরটি বেছে নিল না। একটি সাবনেটের জন্য বৈধ নেটওয়ার্ক ঠিকানা গণনা করা হচ্ছে।
সাধারণত বিটওয়াইজ অপারেশনগুলি গুণ / ভাগ করার চেয়ে দ্রুত হয়। সুতরাং যদি আপনাকে 9 বলে একটি ভেরিয়েবল এক্সকে গুণতে হয়, আপনি এটি করবেন x<<3 + x
যা কয়েক চক্রের চেয়ে দ্রুত হবেx*9
। যদি এই কোডটি কোনও আইএসআরের অভ্যন্তরে থাকে তবে আপনি প্রতিক্রিয়া সময় সাশ্রয় করবেন।
একইভাবে আপনি যদি একটি বিজ্ঞপ্তি সারি হিসাবে একটি অ্যারে ব্যবহার করতে চান তবে বিট বুদ্ধিমান ক্রিয়াকলাপগুলির সাথে চেকের চারপাশে মোড়ানো পরিচালনা করতে এটি দ্রুত (এবং আরও মার্জিত) হবে। (আপনার অ্যারের আকার 2 এর শক্তি হওয়া উচিত) যেমন: আপনি এর tail = ((tail & MASK) + 1)
পরিবর্তে ব্যবহার করতে পারেনtail = ((tail +1) < size) ? tail+1 : 0
যদি সন্নিবেশ / মুছতে চান তবে আপনি এর ।
এছাড়াও আপনি যদি একাধিক ত্রুটি কোডগুলি একসাথে ধরে রাখতে ত্রুটির পতাকা চান তবে প্রতিটি বিট পৃথক মান রাখতে পারে। আপনি এটি প্রতিটি পরীক্ষামূলক ত্রুটি কোড সহ এবং এটি করতে পারেন। এটি ইউনিক্স ত্রুটি কোডগুলিতে ব্যবহৃত হয়।
এছাড়াও একটি এন-বিট বিটম্যাপ সত্যিই দুর্দান্ত এবং কমপ্যাক্ট ডেটা স্ট্রাকচার হতে পারে। আপনি যদি আকার এন এর একটি রিসোর্স পুল বরাদ্দ করতে চান তবে আমরা বর্তমান অবস্থার প্রতিনিধিত্ব করতে একটি এন-বিট ব্যবহার করতে পারি।
কেউ মনে করেননি নির্দিষ্ট পয়েন্ট গণিতের কথা উল্লেখ করেছেন।
(হ্যাঁ, আমি বৃদ্ধ, ঠিক আছে?)
একটি সংখ্যা x
2 এর শক্তি? (উদাহরণস্বরূপ, অ্যালগরিদমগুলিতে দরকারী যেখানে একটি কাউন্টার বাড়ানো হয় এবং একটি ক্রিয়া কেবল লোগারিদমিক সংখ্যক বার নেওয়া হয়)
(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
x & -x
।
Bitwise অপারেটরদের অ্যারে লুপিং জন্য দরকারী যা দৈর্ঘ্য 2. অনেক মানুষ যেমন উল্লেখ করা হয়েছে শক্তি হয়, bitwise অপারেটরদের অত্যন্ত দরকারী এবং ব্যবহার করা হয় পতাকা , গ্রাফিক্স , নেটওয়ার্কিং , এনক্রিপশন । শুধু তাই নয়, তারা অত্যন্ত দ্রুত। আমার ব্যক্তিগত প্রিয় ব্যবহার শর্ত ছাড়াই একটি অ্যারে লুপ করা । ধরুন আপনার শূন্য-সূচক ভিত্তিক অ্যারে রয়েছে (যেমন প্রথম উপাদানটির সূচক 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;
}
এই দুটি পদ্ধতির নীচের দিকটি হল মডুলাস অপারেটরটি ব্যয়বহুল, যেহেতু এটি পূর্ণসংখ্যা বিভাগের পরে একটি বাকী সন্ধান করে। এবং প্রথম পদ্ধতি প্রতিটি পুনরাবৃত্তির উপর একটি if বিবৃতি চালায় । বিটওয়াইজ অপারেটরের সাহায্যে তবে যদি আপনার অ্যারের দৈর্ঘ্য 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;
যদি num
ছোট বা 7 এর সমান হয় তবে ফলাফলটি হবে num
কারণ &
1 এর সাথে প্রতিটি বিট বিড নিজেই। যদি num
7 এর চেয়ে বড় হয়, &
অপারেশন চলাকালীন কম্পিউটার 7 টি শীর্ষস্থানীয় শূন্যগুলি বিবেচনা করবে যা অবশ্যই &
অপারেশনের পরে জিরো হিসাবে থাকবে কেবল পিছনের অংশটিই থাকবে। 9 & 7
বাইনারি ক্ষেত্রে এটি মত চেহারা হবে
1001 & 0111
ফলাফলটি হবে 0001 যা দশমিক 1 এবং অ্যারেতে দ্বিতীয় উপাদানটিকে সম্বোধন করে।
এটি কোনও স্কয়ার সম্পর্কিত সম্পর্কিত মডেলটিতেও কার্যকর হতে পারে, আসুন আপনাকে নীচের সারণীগুলি বলুন: ব্লগএন্ট্রি, ব্লগক্যাটরি
ট্রেডটোনালি আপনি তাদের মধ্যে একটি ব্লগএন্ট্রি ক্যাটাগরি সারণী ব্যবহার করে একটি সম্পর্ক তৈরি করতে পারেন বা যখন এত বেশি ব্লগক্যাটরি রেকর্ড নেই তখন আপনি ব্লগএন্ট্রিতে একটি মান ব্যবহার করতে পারেন একাধিক ব্লগক্যাটরি রেকর্ডের সাথে লিঙ্ক করার জন্য, আপনি বেশিরভাগ আরডিবিএমএসেও থাকবেন সেই 'পতাকাঙ্কিত' কলামে নির্বাচন করতে খুব দ্রুত অপারেটরগণ ...
আপনি যখন কেবলমাত্র একটি মাইক্রোকন্ট্রোলারের আউটপুটগুলির কিছু বিট পরিবর্তন করতে চান তবে লিখতে নিবন্ধকটি বাইট হয়, আপনি এই জাতীয় কিছু (সিউডোকোড) করুন:
char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs
অবশ্যই, অনেক মাইক্রোকন্ট্রোলার আপনাকে প্রতিটি বিট পৃথকভাবে পরিবর্তনের অনুমতি দেয় ...
আপনি কি কখনো আপনার নম্বর গেলিক ভাষার (%) 2 একটি নির্দিষ্ট ক্ষমতা নিরূপণ করতে চান তাহলে, আপনি ব্যবহার করতে পারেন yourNumber & 2^N-1
, যা এই ক্ষেত্রে হিসাবে একই yourNumber % 2^N
।
number % 16 = number & 15;
number % 128 = number & 127;
এটি কেবলমাত্র খুব কার্যকর ডিভিডেন্ডের সাথে মডিউলাস অপারেশনের বিকল্প হিসাবে কার্যকর যা 2 ^ N ... তবে তারপরেও মডিউলাস অপারেশনটির গতি বাড়ানো আমার .NET 2.0 এ পরীক্ষায় নগণ্য। আমি সন্দেহ করি যে আধুনিক সংকলকরা ইতিমধ্যে এটির মতো অপটিমাইজেশন সম্পাদন করে। কেউ এই সম্পর্কে আরও জানেন?
%
অনুস্মারক অপারেশন, তারা নেতিবাচকটিকে অন্যরকম আচরণ করে। তবে, আপনি যদি পাস uint
করেন %
, সি # সংকলকটি আসলে বিটওয়াইজ ব্যবহার করে মেশিন কোড তৈরি করবে এবং যখন দ্বিতীয় তর্কটি দু'জনের একটি পূর্ব-জ্ঞাত শক্তি।
আমার প্রশ্নের এখানে একটি বাস্তব বিশ্বের ব্যবহার রয়েছে -
কেবলমাত্র প্রথম WM_KEYDOWN বিজ্ঞপ্তিতে সাড়া দিন?
উইন্ডোজ সি এপি বিট 30-এ কোনও ডাব্লুএম_কেডাউন বার্তা গ্রহণ করার সময় পূর্ববর্তী কী অবস্থা নির্দিষ্ট করে। বার্তা প্রেরণের আগে কী নিচে থাকলে মানটি 1 বা কীটি আপ থাকলে শূন্য হয়
এগুলি বেশিরভাগ বিটওয়াইজ অপারেশনের জন্য (অবাক করা) ব্যবহৃত হয়। এখানে পিএইচপি কোডবেসে কয়েকটি বাস্তব-বিশ্বের উদাহরণ পাওয়া গেছে।
অক্ষর এনকোডিং:
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;
যখনই আমি প্রথম সি প্রোগ্রামিং শুরু করেছি, আমি সত্যের টেবিলগুলি এবং সেগুলি সমস্ত কিছুই বুঝতে পেরেছিলাম, তবে আমি এই নিবন্ধটি না পড়া পর্যন্ত এটি কীভাবে প্রকৃতপক্ষে ব্যবহার করতে হবে তা নিয়ে ক্লিক হয়নি ww (যা বাস্তব জীবনের উদাহরণ দেয়)
x == 1
এবং y == 2
তারপর, x || y
1 মূল্যায়ণ এবং x | y
0. মূল্যায়ণ তাছাড়াও আমি দেখতে কেন x^true
শ্রেয় !x
কোন ভাবেই। এটি বেশি টাইপিং, স্বল্প প্রতিমাসূচক এবং যদি এটি x
না হয় তবে bool
এটি অবিশ্বাস্য।
x^true
শ্রেয় !x
হয় some->complicated().member->lookup ^= true;
ইউনারী অপারেটর কোন যৌগ-নিয়োগ সংস্করণ আছে।
আমি এইটিকে বিটওয়াইজ হিসাবে গণনা করি না, তবে রুবির অ্যারে সাধারণ পূর্ণসংখ্যা বিটওয়াইস অপারেটরগুলির মাধ্যমে সেট অপারেশনগুলি সংজ্ঞায়িত করে। তাই [1,2,4] & [1,2,3] # => [1,2]
। একইভাবে a ^ b #=> set difference
এবং জন্য a | b #=> union
।
টাওয়ার অফ হ্যানয় লিনিয়ার সলিউশন সমস্যাটি সমাধান করতে বিটওয়াইজ অপারেশন ব্যবহার করে।
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);
}
}