বিটওয়াইজ অপারেটরগুলির প্রকৃত বিশ্ব ব্যবহারের ক্ষেত্রে [বন্ধ]


224

নিম্নলিখিত বিটওয়াইস অপারেটরগুলির কিছু বাস্তব বিশ্ব ব্যবহারের কেস?

  • এবং
  • XOR যাও
  • না
  • অথবা
  • বাম / ডান স্থানান্তর

1
আমার মনে আছে যখন আমি তাদের সম্পর্কে প্রথম জানতে পেরেছিলাম তখন মনে হয়েছিল এগুলি কেবল নিম্ন-স্তরের সি জন্য ব্যবহৃত হয় ... তবে তখন থেকে তারা সরঞ্জামবক্সে প্রবেশ করেছে এবং আমি "উচ্চ-স্তরের" প্রোগ্রামিং সহ প্রায়ই তাদের ব্যবহার করি। তারা এখন আমার জন্য ঠিক + এবং * এর মতো।
ওক

2
@ অ্যান: আমার মনে, আসল বিশ্বের অর্থ হ'ল নিম্ন স্তরের প্রোগ্রামিং ছাড়া যা বিটওয়াইস অপারেটরগুলির সর্বাধিক সুস্পষ্ট ব্যবহার।
অলিভিয়ের লালনডে



উত্তর:


216
  • বিট ক্ষেত্র (পতাকা)
    তারা এমন কিছু উপস্থাপনের সবচেয়ে কার্যকরী উপায় যার রাজ্যটি বেশ কয়েকটি "হ্যাঁ বা না" বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়। এসিএল একটি ভাল উদাহরণ; যদি আপনার 4 টি স্বতন্ত্র অনুমতি (পড়ুন, লিখুন, সম্পাদন করুন, নীতি পরিবর্তন করুন) বলুন তবে এটি 4 টি বর্জ্যের চেয়ে 1 বাইটে সংরক্ষণ করা ভাল These এগুলি অতিরিক্ত সুবিধার জন্য বহু ভাষায় গণনার প্রকারে ম্যাপ করা যেতে পারে।

  • বন্দর / সকেটের মাধ্যমে যোগাযোগের
    ক্ষেত্রে সর্বদা চেকসাম, সমতা, বিট স্টপ বিট, প্রবাহ নিয়ন্ত্রণ অ্যালগোরিদম এবং এর সাথে জড়িত থাকে যা সাধারণত পৃথক বাইটের যুক্তিযুক্ত মানগুলির উপর নির্ভর করে সংখ্যাসূচক মানগুলির বিপরীতে, কারণ মাধ্যমটি কেবলমাত্র একটি বিট প্রেরণ করতে সক্ষম হতে পারে একটি সময়.

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

  • ফাইনাইট স্টেট মেশিনগুলি
    আমি প্রাথমিকভাবে কিছু ধরণের হার্ডওয়্যার এম্বেড করা ধরনেরটির কথা বলছি, যদিও সেগুলি সফ্টওয়্যারটিতেও পাওয়া যায়। এই প্রকৃতির সংযুক্তিকরণ - তারা আক্ষরিক পেয়ে পারে হবে "কম্পাইল" নিচে লজিক গেটের একটি গুচ্ছ, তাই তারা হিসাবে প্রকাশ করতে হবে AND, OR, NOT, ইত্যাদি

  • গ্রাফিক্স এই অপারেটরগুলি গ্রাফিক্স প্রোগ্রামিংয়ে ব্যবহৃত হয় এমন প্রতিটি অঞ্চলে প্রবেশের জন্য এখানে খুব কমই জায়গা রয়েছে space XOR(বা ^) এখানে বিশেষ আকর্ষণীয় কারণ একই বার দ্বিতীয় বার প্রয়োগ করা প্রথমটিকে পূর্বাবস্থায় ফিরিয়ে আনবে। পুরানো জিইউআইগুলি ব্যয়বহুল পুনর্নির্মাণের প্রয়োজনীয়তা অপসারণের জন্য বাছাই হাইলাইটিং এবং অন্যান্য ওভারলেগুলির জন্য এটির উপর নির্ভর করে। এগুলি এখনও ধীর গ্রাফিক্স প্রোটোকলগুলিতে (যেমন দূরবর্তী ডেস্কটপ) কার্যকর।

এগুলি আমি প্রথম কয়েকটি উদাহরণ নিয়ে এসেছি - এটি খুব কমই একটি সম্পূর্ণ তালিকা।


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

বিটওয়াইজ অপারেশনগুলি ভেক্টরাইজেবল গণনার জন্য কার্যকর?
অ্যারন ফ্র্যাঙ্ক

47

এটা কি অদ্ভুত?

(value & 0x1) > 0

এটি কি দুটি (এমনকি) দ্বারা বিভাজ্য?

(value & 0x1) == 0

3
আপনার ভাষার মানের উপর নির্ভর করে & 0x1> 0 মান হিসাবে পার্স করা যেতে পারে & (0x1> 0)
লিয়ারোয়

3
@ লিয়ারয় - যথেষ্ট সত্য। কিছু পেরেন যোগ করা হয়েছে।
শেঠ

আধুনিক অপ্টিমাইজারগুলি (% 2 মান) এর মত এক্সপ্রেশনগুলিকে উপরের এক্সপ্রেশনগুলিতে স্বয়ংক্রিয়ভাবে রূপান্তর করবে। Godbolt.org/z/mYEBH4
ফেরেরেজি

26

পৃথক বিট হিসাবে সঞ্চিত পতাকাগুলি নিয়ে কাজ করার জন্য এখানে কিছু সাধারণ আইডিয়াম রয়েছে।

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)) {

}

25

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

Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100

আমরা বা এই মানগুলি একসাথে করি এবং পৃষ্ঠাটির সাথে মানটি (একক int হিসাবে) সঞ্চয় করি। উদাহরণস্বরূপ, যদি কোনও পৃষ্ঠা A & B গ্রুপ দ্বারা অ্যাক্সেস করা যায়, তবে পৃষ্ঠা 3 অ্যাক্সেস নিয়ন্ত্রণ হিসাবে আমরা মান 3 (যা বাইনারিতে 00000011 হয়) সংরক্ষণ করি। অনেক একইভাবে, আমরা কোন গ্রুপে রয়েছে সেগুলি উপস্থাপনের জন্য একটি ব্যবহারকারীদের সাথে ওআরইডি গ্রুপ শনাক্তকারীদের একটি মান সংরক্ষণ করি।

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


24

নিম্ন-স্তরের প্রোগ্রামিং একটি ভাল উদাহরণ। উদাহরণস্বরূপ, কিছু হার্ডওয়্যার আপনি যা করতে চান তা করতে মেমরি-ম্যাপযুক্ত রেজিস্ট্রারে আপনাকে একটি নির্দিষ্ট বিট লিখতে হবে:

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))

7
সকলেই মেশিনে কথা বলে না। আপনার দ্বিতীয় উদাহরণটি কি করছে?
কেওসপ্যান্ডিয়ন

7
htons()এবং হোস্ট ( ) এন্ডিয়েননেস থেকে নেটওয়ার্ক ( ) বাইট ক্রমে htonl()একটি shortবা একটি অদলবদল করার জন্য পসিক্স ফাংশন । longhn
কার্ল নরুম

আপনি ও (লগএন) ক্রিয়াকলাপে কিছুটা বিপরীতমুখী করতে অনুরূপ পদ্ধতিটি ব্যবহার করতে পারেন।
মাইক ডিসিমোন

লল আমি যখন এই প্রথম দেখলাম আমি ভেবেছিলাম এটি সমাবেশ!
0x499602D2

নয় htonl()একটি 32 বিট জন্য intমূল্য কত? longবিভিন্ন ভাষায় 64৪-বিট মানে।
অ্যারন ফ্র্যাঙ্ক

21

উদাহরণস্বরূপ, প্যাকড রঙের মূল্যগুলি থেকে আরজিবি (এ) মান পেতে আমি এগুলি ব্যবহার করি।


এবং এটি সত্যিই তা দ্রুত করে!
কলম রজার্স

সি # তে এটি এমন একটি ক্ষেত্রে যেখানে পাঠযোগ্যতা এবং গতির জন্য এটি সত্যই সেরা সমাধান।
ক্যাপ্টেনকেসি

4
আমার মেশিনে, এর (a & b) >> cচেয়ে 5 গুণ বেশি a % d / eগতিযুক্ত (এআরজিবি প্রতিনিধিত্বকারী কোনও ইন্টি থেকে একক রঙের মান বের করার উভয় উপায়)। সম্মিলিতভাবে, 1 বিলিয়ন পুনরাবৃত্তির জন্য 6.7 এবং 35.2 গুলি।
বেনজি XVI

@ বেনজিএক্সভিআই সি # এর জন্য এটি সংকলক অপ্টিমাইজেশন রয়েছে। আপনি গতির পার্থক্য পর্যবেক্ষণ করার কারণটি হ'ল সি # তে %মডুলাস অপারেটর নয়, এটি রিমাইন্ডার অপারেটর। এগুলি ইতিবাচক মানের জন্য সমান তবে নেতিবাচক মানগুলির সাথে পৃথক। আপনি যদি যথাযথ বিধিনিষেধ সরবরাহ করেন ( উদাহরণস্বরূপ uintপরিবর্তে একটি পাস int) তবে দুটি উদাহরণ একই গতি হওয়া উচিত।
অ্যারন ফ্র্যাঙ্ক

দুঃখিত আমি জানি অনেক দিন হয়ে গেল আপনি কি দয়া করে প্রতিটি একক আরজিবি মান পেতে তাদের কীভাবে ব্যবহার করবেন তার একটি উদাহরণ দেখাতে পারেন?
জিন্স

14

যখন আমার কাছে বুলেটিয়ান পতাকা রয়েছে তখন আমি সেগুলি সমস্তগুলিতে সংরক্ষণ করতে চাই।

আমি বিটওয়াইস-ও্যান্ড ব্যবহার করে সেগুলি পেয়েছি। উদাহরণ স্বরূপ:

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

প্রভৃতি


23
আশা করি সেগুলি আসলে আপনার আসল কোডে ধ্রুবক এবং যাদু সংখ্যার নয় :)
আর্লজ

1
নিম্ন-স্তরের বিশ্বের বুলিয়ান পতাকা ব্যবহারের একটি উদাহরণ বিভিন্ন জিইআইআই প্ল্যাটফর্মের সাথে স্টাফ করছে। উদাহরণস্বরূপ আপনি এটি বন্ধ করতে my_button.Style | = STYLE_DISABLED ব্যবহার করতে পারেন।
মরিশেল

1
আমি জানি যে এই বিষয়টি ভাষা অজ্ঞেয়গত, তবে সি বিট-ফিল্ডগুলির সাথে এটি করার একটি সহজ উপায় সরবরাহ করে যাতে আপনি পছন্দ মতো জিনিস ব্যবহার করতে পারেন if (flags.feature_one_is_one) { // turn on feature }। এটি এএনএসআই সি স্ট্যান্ডার্ডে রয়েছে, সুতরাং বহনযোগ্যতার বিষয়টি হওয়া উচিত নয়।
পোল্যান্ডার

কোডটির এই স্নিপেটটি কী করে, পতাকা কেন শুরু করা হয় না, "
এগুলি সমস্তগুলিকে একটি ইনট্রে স্টোর করে রাখি

12

& = এবং:
নির্দিষ্ট বিটগুলি মাস্ক করুন।
আপনি নির্দিষ্ট বিটগুলি সংজ্ঞায়িত করছেন যা প্রদর্শিত বা প্রদর্শিত হবে না। 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


নিম্নলিখিতটি একটি লিঙ্ক যা সুপার দ্রুত গণিত ক্রিয়াকলাপের জন্য এএস 3-তে বিটওয়াইয়া অপারেটরগুলি ব্যবহারের দুর্দান্ত উদাহরণ দেয় (তবে এটি সম্ভবত বেশিরভাগ ভাষায় প্রয়োগ করা যেতে পারে): Lab.polygonal.de/2007/05/10/bitwise-gems-fast- পূর্ণসংখ্যার গণিত
19'10

আমি মনে করি "না" হওয়া উচিত = ~, না |=, যা ওআর।
মাইক ডিসিমোন

এর জন্য & = AND- আমি কেন সমস্ত বিটগুলি সাফ করতে চাই, কেন আমি বাইটের একটি অপরিবর্তিত সংস্করণ পেতে চাই এবং নীচের নীচলে আমি কী করব?
বিভ্রান্ত

1
@ বিভ্রান্ত00 ডান, কোনও ফলাফল বাতিল করার দ্রুত / সহজ উপায় xorএটি নিজেই। আমি নীচের নীচটি বের করতে চাইলে বেশ কয়েকটি কারণ সম্পর্কে ভাবতে পারি। বিশেষত যদি সেই নিম্ন স্তনবৃন্ত কোনও ডেটা স্ট্রাকচারের অংশ হয় এবং আপনি এটি একটি মুখোশ হিসাবে ব্যবহার করতে চান বা ORএটি অন্য স্ট্রাক্ট সহ।
জেমস এম। লে

11

এনক্রিপশন সমস্ত বিটওয়াইজ অপারেশন।


4
সত্যি? এনক্রিপশন বাস্তবায়ন সম্ভবত বিটওয়াইস অপস ব্যবহার করতে পারে তবে এনক্রিপশন অ্যালগরিদমগুলি সাধারণত সংখ্যার পদগুলিতে বর্ণিত হয় বিট উপস্থাপনার ক্ষেত্রে নয়।
কনস্টান্টিন

1
সুতরাং এগুলি বাস্তবায়ন ব্যতীত আপনি অ্যালগোরিদমগুলি দিয়ে কী করবেন? আমি কৌতুহলী.
পুনরাবৃত্তি

2
@Constantin: দেখুন, উদাহরণস্বরূপ, কিভাবে DES বাস্তবায়িত হয় বর্ণনার: ( en.wikipedia.org/wiki/...
ওয়েন কনরাড

1
@ রিসার্সিভ, আপনি যদি আমার সম্পর্কে ব্যক্তিগতভাবে জিজ্ঞাসা করেন - আমি ক্রিপ্টোগ্রাফিক অ্যালগরিদমগুলি ডিজাইন করি না বা সেগুলি বাস্তবায়ন করি না। তাত্ত্বিক দুর্বলতার জন্য লোকেদের বিশ্লেষণ করার মতো অনেক কিছুই থাকে।
কনস্টান্টিন

@Constantin: এই কটাক্ষপাত করা, এই অনেক মধ্যে মাত্র এক উদাহরণ হিসাবে কিভাবে (অংশ) ক্রিপ্টোগ্রাফিক আলগোরিদিম সাধারণত বর্ণনা করা হয় করা: en.wikipedia.org/wiki/Substitution_box
SyntaxT3rr0r

9

আপনি এটিকে ডেটা হ্যাশ করার দ্রুত এবং নোংরা উপায় হিসাবে ব্যবহার করতে পারেন।

int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;

8

আমি ^পিএলসির সাথে সিরিয়াল যোগাযোগের জন্য একটি চেকসাম গণনা করতে প্রায় তিন মিনিট আগে মাত্র বিটওয়াইস-এক্সওআর ( ) ব্যবহার করেছি ...


7

বিটওয়াইস এবং বাইটের নির্দিষ্ট অংশটি মাস্কিং / নিষ্কাশন করতে ব্যবহৃত হয়।

1 বাইট পরিবর্তনশীল

 01110010
&00001111 Bitmask of 0x0F to find out the lower nibble
 --------
 00000010

বিশেষত শিফট অপারেটর (<< >>) প্রায়শই গণনার জন্য ব্যবহৃত হয়।


6

বাইট ফর্ম্যাটে বিটম্যাপ চিত্র থেকে রঙগুলি পড়ার এটি উদাহরণ 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.

আমি আশা করি এই ক্ষুদ্র উদাহরণগুলি সাহায্য করবে ....


5

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

//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;
    }

অত্যন্ত সহজ, তবে বিমূর্ততার স্তরে একটি ঝরঝরে বাস্তবায়ন যা সাধারণত বিটওয়াইজ অপারেশনগুলির প্রয়োজন হয় না।


4

বেস 64 এনকোডিং একটি উদাহরণ। বেস 64 এনকোডিং ইমেল সিস্টেমের (এবং অন্যান্য উদ্দেশ্যে) প্রেরণের জন্য বাইনারি ডেটা প্রিন্টযোগ্য অক্ষর হিসাবে উপস্থাপন করতে ব্যবহৃত হয়। বেস 64 এনকোডিং 8 বিট বাইটের একটি সিরিজকে 6 বিট চরিত্রের অনুসন্ধান সূচকে রূপান্তর করে। বেস 64, এনকোডিং এবং ডিকোডিংয়ের জন্য প্রয়োজনীয় বিট ক্রিয়াকলাপগুলি বাস্তবায়নের জন্য বিট অপারেশন, শিফটিং, এবং'িং, বা 'নাং করা খুব কার্যকর।

এটি অবশ্যই অগণিত উদাহরণগুলির মধ্যে 1 টি।


4

আমি অবাক হয়েছি যে কেউ ইন্টারনেট বয়সের সুস্পষ্ট উত্তরটি বেছে নিল না। একটি সাবনেটের জন্য বৈধ নেটওয়ার্ক ঠিকানা গণনা করা হচ্ছে।

http://www.topwebhosts.org/tools/netmask.php


4

সাধারণত বিটওয়াইজ অপারেশনগুলি গুণ / ভাগ করার চেয়ে দ্রুত হয়। সুতরাং যদি আপনাকে 9 বলে একটি ভেরিয়েবল এক্সকে গুণতে হয়, আপনি এটি করবেন x<<3 + xযা কয়েক চক্রের চেয়ে দ্রুত হবেx*9 । যদি এই কোডটি কোনও আইএসআরের অভ্যন্তরে থাকে তবে আপনি প্রতিক্রিয়া সময় সাশ্রয় করবেন।

একইভাবে আপনি যদি একটি বিজ্ঞপ্তি সারি হিসাবে একটি অ্যারে ব্যবহার করতে চান তবে বিট বুদ্ধিমান ক্রিয়াকলাপগুলির সাথে চেকের চারপাশে মোড়ানো পরিচালনা করতে এটি দ্রুত (এবং আরও মার্জিত) হবে। (আপনার অ্যারের আকার 2 এর শক্তি হওয়া উচিত) যেমন: আপনি এর tail = ((tail & MASK) + 1)পরিবর্তে ব্যবহার করতে পারেনtail = ((tail +1) < size) ? tail+1 : 0 যদি সন্নিবেশ / মুছতে চান তবে আপনি এর ।

এছাড়াও আপনি যদি একাধিক ত্রুটি কোডগুলি একসাথে ধরে রাখতে ত্রুটির পতাকা চান তবে প্রতিটি বিট পৃথক মান রাখতে পারে। আপনি এটি প্রতিটি পরীক্ষামূলক ত্রুটি কোড সহ এবং এটি করতে পারেন। এটি ইউনিক্স ত্রুটি কোডগুলিতে ব্যবহৃত হয়।

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



3

একটি সংখ্যা x2 এর শক্তি? (উদাহরণস্বরূপ, অ্যালগরিদমগুলিতে দরকারী যেখানে একটি কাউন্টার বাড়ানো হয় এবং একটি ক্রিয়া কেবল লোগারিদমিক সংখ্যক বার নেওয়া হয়)

(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

স্বাক্ষরবিহীন প্রকারে এলএইচএস কাস্ট করে সিতে স্বাক্ষরযুক্ত ডান শিফটটি করা হয়। আপনার শেষ সূত্রটি সর্বনিম্ন [সেট] বিটটি খুঁজে পায় না, এটি এক্স 2 এর শক্তি কিনা তা পরীক্ষা করে the সর্বনিম্ন সেট বিটটি খুঁজে পেতে, করুন x & -x
পোটোটোভটার

হুম, আপনি ঠিকই বলেছেন, কোনওভাবেই আমি সম্পাদনাটির জন্য প্রথম স্নিপেটের সাথে x ও -x প্রতিস্থাপন করেছি
দিমিত্রিস এন্ড্রেউ

3

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 এর সাথে প্রতিটি বিট বিড নিজেই। যদি num7 এর চেয়ে বড় হয়, &অপারেশন চলাকালীন কম্পিউটার 7 টি শীর্ষস্থানীয় শূন্যগুলি বিবেচনা করবে যা অবশ্যই &অপারেশনের পরে জিরো হিসাবে থাকবে কেবল পিছনের অংশটিই থাকবে। 9 & 7বাইনারি ক্ষেত্রে এটি মত চেহারা হবে

1001 & 0111

ফলাফলটি হবে 0001 যা দশমিক 1 এবং অ্যারেতে দ্বিতীয় উপাদানটিকে সম্বোধন করে।


আপনার মন্তব্যটি অর্ধেক করে পাঠ্য যদি আপনার অ্যারের দৈর্ঘ্য 2 হয় তবে প্রথম বাক্যে রাখা উচিত। এই কৌশলটি ব্যবহার করার জন্য এটি একটি অত্যন্ত গুরুতর সীমাবদ্ধতা। ব্যক্তিগতভাবে আমি এটিকে যাইহোক বাস্তবায়িত করব না, কোডটি যদি বা মোডের পদ্ধতির চেয়ে বেশি বোঝা যায় তবে এটি আরও কঠিন ।
জান ডোগজেন

@ জনডোগেন আপনি ঠিক বলেছেন, আমি এটি প্রথম বাক্যে রেখে দেব। অ্যারে দু'জনের পাওয়ার হিসাবে, আমার অভিজ্ঞতায় যখন কাজ হয়েছিল তখন কয়েকবারের বেশি ছিল। সম্ভবত এটি নেটওয়ার্ক এবং গ্রাফিকগুলির সাথে সম্পর্কিত ছিল।
ব্যবহারকারী 3552161

1
এই পোস্টের মূল বিষয়টিটি দেখানো হয়েছিল যে বিটওয়াইস অপারেটরগুলি সংখ্যা, 0, 1, 2, 3, 0, 1, 2 সিকোয়েন্স তৈরির জন্য দরকারী ... সিক্যুয়েন্সটি কেবল প্রথম যেটি মনে পড়েছিল।
ব্যবহারকারী 3552161

2

আমি এগুলি বহু নির্বাচনী বিকল্পের জন্য ব্যবহার করি, এইভাবে আমি কেবল 10 বা তার বেশি পরিবর্তে একটি মান সঞ্চয় করি


2

এটি কোনও স্কয়ার সম্পর্কিত সম্পর্কিত মডেলটিতেও কার্যকর হতে পারে, আসুন আপনাকে নীচের সারণীগুলি বলুন: ব্লগএন্ট্রি, ব্লগক্যাটরি

ট্রেডটোনালি আপনি তাদের মধ্যে একটি ব্লগএন্ট্রি ক্যাটাগরি সারণী ব্যবহার করে একটি সম্পর্ক তৈরি করতে পারেন বা যখন এত বেশি ব্লগক্যাটরি রেকর্ড নেই তখন আপনি ব্লগএন্ট্রিতে একটি মান ব্যবহার করতে পারেন একাধিক ব্লগক্যাটরি রেকর্ডের সাথে লিঙ্ক করার জন্য, আপনি বেশিরভাগ আরডিবিএমএসেও থাকবেন সেই 'পতাকাঙ্কিত' কলামে নির্বাচন করতে খুব দ্রুত অপারেটরগণ ...


2

আপনি যখন কেবলমাত্র একটি মাইক্রোকন্ট্রোলারের আউটপুটগুলির কিছু বিট পরিবর্তন করতে চান তবে লিখতে নিবন্ধকটি বাইট হয়, আপনি এই জাতীয় কিছু (সিউডোকোড) করুন:

char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs

অবশ্যই, অনেক মাইক্রোকন্ট্রোলার আপনাকে প্রতিটি বিট পৃথকভাবে পরিবর্তনের অনুমতি দেয় ...


এটি কোন ভাষা হওয়ার কথা?
কারসন মায়ার্স

@ কারসন: কোন ভাষা নয়, এটি সিউডোকোড। আমি আসলে এটি করা হলে করেছি যে কয়েক বছর আগে এটা পরিষদের ছিল, কিন্তু আমি এর মধ্যে সি ধন্যবাদ এটা করতে জন্য মাথা আপ, আমি তা পরিষ্কার আপডেট করব সহজ অনুমান করা
এমিলিও এম Bumachar

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

2

আপনি কি কখনো আপনার নম্বর গেলিক ভাষার (%) 2 একটি নির্দিষ্ট ক্ষমতা নিরূপণ করতে চান তাহলে, আপনি ব্যবহার করতে পারেন yourNumber & 2^N-1, যা এই ক্ষেত্রে হিসাবে একই yourNumber % 2^N

number % 16 = number & 15;
number % 128 = number & 127;

এটি কেবলমাত্র খুব কার্যকর ডিভিডেন্ডের সাথে মডিউলাস অপারেশনের বিকল্প হিসাবে কার্যকর যা 2 ^ N ... তবে তারপরেও মডিউলাস অপারেশনটির গতি বাড়ানো আমার .NET 2.0 এ পরীক্ষায় নগণ্য। আমি সন্দেহ করি যে আধুনিক সংকলকরা ইতিমধ্যে এটির মতো অপটিমাইজেশন সম্পাদন করে। কেউ এই সম্পর্কে আরও জানেন?


কম্পাইলার এই অপ্টিমাইজেশান ব্যবহার করেন ... কিন্তু আপনি যদি অপ্টিমাইজেশান সম্পর্কে জানেন না, আপনি একটি ভাজক 2. এর একটি সঠিক ক্ষমতা যে বাছাই ব্যর্থ হতে পারে
বেন Voigt

এটা পরিস্থিতির উপর নির্ভর করে। সি # তে এটি প্রকৃতপক্ষে বিভিন্ন ফলাফল তৈরি করে, যেমন %অনুস্মারক অপারেশন, তারা নেতিবাচকটিকে অন্যরকম আচরণ করে। তবে, আপনি যদি পাস uintকরেন %, সি # সংকলকটি আসলে বিটওয়াইজ ব্যবহার করে মেশিন কোড তৈরি করবে এবং যখন দ্বিতীয় তর্কটি দু'জনের একটি পূর্ব-জ্ঞাত শক্তি।
অ্যারন ফ্র্যাঙ্ক

1

আমি তাদের ভূমিকা ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ সিস্টেমে ব্যবহার করতে দেখেছি।


1

আমার প্রশ্নের এখানে একটি বাস্তব বিশ্বের ব্যবহার রয়েছে -
কেবলমাত্র প্রথম WM_KEYDOWN বিজ্ঞপ্তিতে সাড়া দিন?

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


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;

1

যখনই আমি প্রথম সি প্রোগ্রামিং শুরু করেছি, আমি সত্যের টেবিলগুলি এবং সেগুলি সমস্ত কিছুই বুঝতে পেরেছিলাম, তবে আমি এই নিবন্ধটি না পড়া পর্যন্ত এটি কীভাবে প্রকৃতপক্ষে ব্যবহার করতে হবে তা নিয়ে ক্লিক হয়নি ww (যা বাস্তব জীবনের উদাহরণ দেয়)


1
না, এটি এক রকম নয়। সি, যদি x == 1এবং y == 2তারপর, x || y1 মূল্যায়ণ এবং x | y0. মূল্যায়ণ তাছাড়াও আমি দেখতে কেন x^trueশ্রেয় !xকোন ভাবেই। এটি বেশি টাইপিং, স্বল্প প্রতিমাসূচক এবং যদি এটি xনা হয় তবে boolএটি অবিশ্বাস্য।
ডেভিড থর্নলি

ওহ অপেক্ষা করুন .. হ্যাঁ, এটা আমার পক্ষ থেকে বোবা .. আমি আজ সোজা ভাবতে পারি না।
আর্লজ

এক্স | y 3 এর মূল্যায়ন করে (সম্পাদনা: এনভিএম, আমি দেখতে পাচ্ছি আপনি দূরে সম্পাদিত কোনও কিছুর প্রতি প্রতিক্রিয়া জানাচ্ছেন!)
পড

1
@DavidThornley এক ক্ষেত্রে যখন x^trueশ্রেয় !xহয় some->complicated().member->lookup ^= true; ইউনারী অপারেটর কোন যৌগ-নিয়োগ সংস্করণ আছে।
বেন ভয়েগট

1

আমি এইটিকে বিটওয়াইজ হিসাবে গণনা করি না, তবে রুবির অ্যারে সাধারণ পূর্ণসংখ্যা বিটওয়াইস অপারেটরগুলির মাধ্যমে সেট অপারেশনগুলি সংজ্ঞায়িত করে। তাই [1,2,4] & [1,2,3] # => [1,2]। একইভাবে a ^ b #=> set differenceএবং জন্য a | b #=> union


1

টাওয়ার অফ হ্যানয় লিনিয়ার সলিউশন সমস্যাটি সমাধান করতে বিটওয়াইজ অপারেশন ব্যবহার করে।

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);
    }
}

এই সমাধানের ব্যাখ্যা এখানে পাওয়া যাবে

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