বহু বুলিয়ান রাজ্যকে একটি সংখ্যায় সংরক্ষণ / প্যাক করার নাম কী?


55

এটি এক ধরণের সহজ সংকোচনের যেখানে আপনি বহু বুলিয়ান / বাইনারি রাজ্যগুলি সংরক্ষণ করতে দ্বিগুণ এবং প্রতিটি দ্বিগুণ সংখ্যা পূর্ববর্তী সমস্ত সংখ্যার যোগফল 1 + ব্যবহার করে একটি সংখ্যক পরিবর্তনশীল ব্যবহার করেন।

আমি নিশ্চিত এটি অবশ্যই একটি পুরাতন, সুপরিচিত প্রযুক্তি, আমি এটি জানতে চাই এটি সঠিকভাবে উল্লেখ করার জন্য এটি কী বলে। আমি এটি বর্ণনা করার জন্য যেভাবেই ভাবতে পারি সে সম্পর্কে আমি বেশ কয়েকটি অনুসন্ধান করেছি, তবে নিবন্ধের লেখকরা নিজেরাই এটি আবিষ্কার করেছেন এবং এটি কী কল করবেন তা জানেন না এমন কয়েকটি ব্লগ নিবন্ধের বাইরে কিছুই খুঁজে পেল না ( উদাহরণ 1 , উদাহরণ 2 )।

উদাহরণস্বরূপ, ধারণাটি চিত্রিত করার উদ্দেশ্যে এখানে একটি খুব সাধারণ বাস্তবায়ন দেওয়া হয়েছে:

packStatesIntoNumber () {
  let num = 0
  if (this.stateA) num += 1
  if (this.stateB) num += 2
  if (this.stateC) num += 4
  if (this.stateD) num += 8
  if (this.stateE) num += 16
  if (this.stateF) num += 32
  return num
}

unpackStatesFromNumber (num) {
  assert(num < 64)
  this.stateF = num >= 32; if (this.stateF) num -= 32
  this.stateE = num >= 16; if (this.stateE) num -= 16
  this.stateD = num >= 8; if (this.stateD) num -= 8
  this.stateC = num >= 4; if (this.stateC) num -= 4
  this.stateB = num >= 2; if (this.stateB) num -= 2
  this.stateA = num >= 1; if (this.stateA) num -= 1
}

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


8
সি # তে, enumsএবং তাদের একটি Flagsবৈশিষ্ট্য থাকতে পারে। তারা আপনার কোডটি আরও সহজ করে তুলতে পারে।
বার্নহার্ড হিলার

12
আমি এই "সিমুলেটিং বিট ক্ষেত্র" কল করব। স্থান দক্ষতা অত্যধিক গুরুত্বপূর্ণ না হলে এটি প্রায়শই একটি খারাপ ধারণা।
কিলিয়ান ফুট

7
@ কিলিয়ানফথ এ boolসাধারণত অভ্যন্তরীণভাবে 32 বিট পূর্ণসংখ্যার হিসাবে সংরক্ষণ করা হয়। যেমন, প্যাকিং 32 এর একটি ফ্যাক্টরের পার্থক্য তৈরি করতে পারে That's এটি সত্যিই অনেক। আমার অর্থ, আমরা প্রোগ্রামাররা সর্বদা আমাদের অর্ধেক সম্পদ ফেলে দিতে প্রস্তুত, তবে আমি সাধারণত তাদের 97% ফেলে দিতে নারাজ। এই জাতীয় বর্জ্য কারণগুলি সহজেই গুরুত্বপূর্ণ ব্যবহারের কেস চালাতে সক্ষম হওয়া এবং স্মৃতিশক্তি হারিয়ে যাওয়ার মধ্যে পার্থক্য করতে পারে।
15:19

3
Orতিহাসিকভাবে, সাধারণত বিট মাস্কগুলি মানগুলি ঘোষণা, সেট এবং পুনরুদ্ধার করতে ব্যবহৃত হয়। শিফ্ট ব্যবহার করা বিজোড় এবং বাস্তবের সর্বোত্তম চিত্র নয়।
জিমি জেমস

3
@ কেমাস্টার যেভাবে বুলগুলি সেভাবে সঞ্চিত করা হয় তা কারণ একক মেমরি অবস্থান ভাগ করা (আজকের মেশিনগুলিতে 32 বা 64 বিট) ক্যাশে পারফরম্যান্সের জন্য খুব খারাপ হতে পারে যদি না আপনি মেশিন ল্যাংগুয়েজ কোডটিতে মনোযোগ না দেন। যদি আপনার কাছে সত্যিকারের বিশাল সংখ্যক বিট থাকে তবে এটি সম্ভবত এটির পক্ষে মূল্যবান তবে যদি আপনি নেটওয়ার্ক বা ডিস্কে সংক্রমণ করার জন্য প্রস্তুত থাকেন তবে আপনি সম্ভবত প্রাক-অনুকূলিতকরণ এবং বিটগুলি প্যাকিংয়ের চেয়ে ভাল are
বিল কে

উত্তর:


107

এটি বেশিরভাগ ক্ষেত্রে বিট ফিল্ড হিসাবে পরিচিত এবং অন্য একটি শব্দ যা আপনি প্রায়শই শুনতে পাবেন তা হ'ল বিট মাস্ক , যা পৃথক বিট মান বা পুরো বিট ক্ষেত্র একবারে পেতে বা সেট করতে ব্যবহৃত হয়।

অনেক প্রোগ্রামিং ভাষার এটিতে সহায়তা করার জন্য সহায়ক কাঠামো রয়েছে। @ বার্নহার্ডহিলার মন্তব্যগুলিতে উল্লেখ করেছেন যে, সি # এর পতাকা সহ এনাম রয়েছে ; জাভাতে এনামসেট ক্লাস রয়েছে।


4
আমি "বিট ফিল্ড" ব্যাখ্যার সাথে এমন ভাষা বৈশিষ্ট্য ব্যবহার করব যা বিটওয়াইস অপারেটরগুলির সাথে ম্যানুয়ালি না করে কোনও বিটকে কাঠামোর ক্ষেত্রগুলিতে বরাদ্দ করতে দেয়।
পিটার গ্রিন

22
@ পিটারগ্রিন যা স্ট্যান্ডার্ড ব্যাখ্যার চেয়ে আলাদা হবে।
এরিক 19

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

1
সি # এরও রয়েছে BitArray, যা বিটগুলির একটি নির্বিচার পরিমাণ সঞ্চয় করতে এবং সেগুলি সূচীকরণের অনুমতি দেয় (যখন পতাকাগুলি একটি পূর্ণসংখ্যার ধরণের সীমাবদ্ধ থাকে এবং মুখোশ হিসাবে ব্যবহার করার উদ্দেশ্যে)।
লুয়ান

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

20

অদ্ভুত, এখানে বিভিন্ন শর্তাবলীর বেশ কিছুটা কিন্তু তত্ক্ষণাত মনে পড়ে এমনটি আমি দেখতে পাচ্ছি না (এবং এটি আপনার প্রশ্নের শিরোনামে রয়েছে!) - বিট প্যাকিং যা আমি সর্বদা এটির নামেই শুনেছি।

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

http://www.kinematicsoup.com/news/2016/9/6/data-compression-bit-packing-101

যা এসও উদ্দেশ্যে দুর্দান্ত নয় তবে এটি এই সংক্ষিপ্ত বিবরণ সহ আমি সবচেয়ে ভাল সংজ্ঞা / বিবরণ খুঁজে পেতে পারি: "বিট-প্যাকিং একটি সহজ ধারণা: ডেটা টুকরো সংরক্ষণ করার জন্য যতটা সম্ভব বিট ব্যবহার করুন।"


আপনি কিছু রেফারেন্স সরবরাহ করতে পারেন? আকর্ষণীয় শব্দ।
গ্রেগ বার্গার্ট

13
বিট প্যাকিং প্রযুক্তিগতভাবে সঠিক তবে এটি কেবল বুলিয়ান রাজ্যের চেয়ে আরও সাধারণ জিনিসকে বোঝায় - যতটা সম্ভব বিট সংক্ষিপ্ত সংখ্যায় সাধারণভাবে তথ্য সংরক্ষণ করে। উদাহরণস্বরূপ, এর অন্য ব্যবহারের অর্থ একটিতে charদুটি charগুলি রেখে একটি অ্যারে সংকুচিত করা হতে পারে int
ইজকাটা

@ গ্রেগবার্গার্ড্ট আপনি জানেন, এটি আকর্ষণীয়। আমি যখন পোস্ট করলাম তখন আমি এটি সম্পর্কে ভেবে দেখিনি কারণ আমি যখন সি এবং অ্যাসেমব্লিতে প্রোগ্রামিং শিখছিলাম তখন 80/90-এর দশকে এই শব্দটি এতটাই প্রচলিত ছিল - এখন যদিও গুগল অনুসন্ধানে অনেকের উল্লেখ পাওয়া গেছে তবে এর জন্য একটি নির্দিষ্ট উইকিপিডিয়া পৃষ্ঠা নেই । গুগলের প্রথম উত্তরের এই সংজ্ঞা রয়েছে: "বিট-প্যাকিং একটি সহজ ধারণা: একটি টুকরো ডেটা সঞ্চয় করতে যতটা সম্ভব বিট ব্যবহার করুন।" kinematicsoup.com/news/2016/9/6/…
বিল কে

আমি যখন বিট প্যাকিং সম্পর্কেও শিখেছি, যদিও আপনি কেবল অব্যবহৃত 0 এর পুনর্নির্মাণের চেয়ে খুব বেশি ক্রেজিয়ার পেতে পারেন যা নামমাত্র পূর্ণসংখ্যার মান হতে পারে। কয়েক বছর আগে আমি এমন একটি সিস্টেমে দৌড়েছিলাম যা এর 8 টি বিট ফ্লোট হিসাবে এর পরামিতিগুলির একটি সংরক্ষণ করে। আইআইআরসি 5 স্বাক্ষরিত স্বাক্ষরিত ম্যান্টিসার জন্য বিট (সমস্ত মান সুনির্দিষ্টভাবে সাইন সংরক্ষণ করার প্রয়োজন ছিল না), এবং বেস 10 এক্সপোনেন্টের জন্য আরও 3 টি। এমন সময় আমি ধরে নিয়েছিলাম যে এটি কোনও উত্তরাধিকারী হার্ডওয়্যার ক্লডেজ যা সামনে কোনও পথ নেই, তবে মেশিন লার্নিং দিয়ে সম্প্রতি ইন্ট 4 বনাম ইনট 8 দিয়ে স্টাফ করা শুরু করেছিলাম, আমি দেখতে পেলাম যে কিছু কাজের চাপ এফপি 16 থেকে নেমে যাচ্ছে।
ড্যান নীলি 18

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

14

এটি বর্ণনা করতে বিভিন্ন পদ ব্যবহার করা হয়।

বেশিরভাগ বিটগুলিকে "বিট পতাকা" বা "বিট ফিল্ডস" বলা হয়।
(তবে, এটি লক্ষণীয় যে "বিট ক্ষেত্রগুলি" মাঝে মাঝে সি এবং সি ++ ভাষার একটি নির্দিষ্ট বৈশিষ্ট্যকে বোঝায়, যা সম্পর্কিত তবে ঠিক একই নয়))

পূর্ণসংখ্যা নিজেই ব্যবহার এবং পরিস্থিতিগুলির উপর নির্ভর করে "বিট অ্যারে", "বিট সেট" বা "বিট ভেক্টর" হিসাবে বিভিন্নভাবে উল্লেখ করা হয়।

যে কোনও উপায়ে, বিট সেট / ভেক্টর / অ্যারে থেকে বিটগুলি উত্তোলন শিফটিং এবং মাস্কিংয়ের মাধ্যমে করা হয়।
(অর্থাত্ কিছুটা মুখোশ ব্যবহার করা ))


সক্রিয় ব্যবহারে প্রতিটি শব্দটির কয়েকটি উদাহরণের জন্য:

  • বিষয়টিতে উইকিপিডিয়ায় নিবন্ধটির নাম বিট অ্যারে , যা নোট করে যে এটি "বিট ম্যাপ, বিট সেট, বিট স্ট্রিং বা বিট ভেক্টর হিসাবেও পরিচিত"
  • সি ++ ব্যবহার করে std::bitset
  • জাভা ব্যবহার করে BitSet
  • সি # ব্যবহার করে BitArray
  • Stackoverflow ট্যাগ আছে bitvector, bitarrayএবংbitset
  • পাইপিতে একটি bitarrayপ্রকল্প এবং একটি BitVectorপ্রকল্প রয়েছে

এটি আসলে প্রশ্নের সাথে প্রাসঙ্গিক নয় তবে আমি বলতে চাই: দয়া করে বিটগুলি সেট করে পরিষ্কার করতে সংযোজন এবং বিয়োগফল ব্যবহার করবেন না কারণ এই পদ্ধতিগুলি ত্রুটি হওয়ার আশঙ্কা রয়েছে।
(যেমন আপনি যদি num += 1দু'বার করেন তবে ফলাফলটি সমান num += 2))

পরিবর্তে উপযুক্ত বিটওয়াইজ অপারেশনগুলি ব্যবহার করতে পছন্দ করুন, যদি আপনার নির্বাচিত ভাষা তাদের সরবরাহ করে:

packStatesIntoNumber ()
{
  let num = 0
  if (this.stateA) num |= 1
  if (this.stateB) num |= 2
  if (this.stateC) num |= 4
  if (this.stateD) num |= 8
  if (this.stateE) num |= 16
  if (this.stateF) num |= 32
  return num
}

unpackStatesFromNumber (num)
{
  this.stateF = ((num & 32) != 0);
  this.stateE = ((num & 16) != 0);
  this.stateD = ((num & 8) != 0);
  this.stateC = ((num & 4) != 0);
  this.stateB = ((num & 2) != 0);
  this.stateA = ((num & 1) != 0);
}

1
this.stateF = (num & 32) ? true : false, ইত্যাদি। numআপনি মানগুলি বের করার সময় পরিবর্তন করতে হবে না।
রজার লিপসক্বে

3
গুড বিন্দু @RogerLipscombe, আমি সত্যিই, কি কোড করছিলাম মাধ্যমে পড়া হয় নি শুধু ব্যবহার প্রতিক্রিয়া +এবং -। আমি এখন আরও উন্নত হয়েছি এবং != 0তার্নারির পরিবর্তে ব্যবহার করেছি , যা এখনও অনুধাবন করা অবস্থায় আমার আরও সংক্ষিপ্ত বলে মনে হয়।
ফারাপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.