বুলিয়ান 1 বাইট এবং 1 বিট আকারের নয় কেন?


127

সি ++ এ,

  • বুলিয়ান 1 বাইট এবং 1 বিট আকারের নয় কেন?
  • 4-বিট বা 2-বিট পূর্ণসংখ্যার মতো ধরণগুলি কেন নেই?

সিপিইউতে এমুলেটর লেখার সময় আমি উপরের জিনিসগুলি মিস করছি


10
সি ++ এ আপনি বিট-ফিল্ড ব্যবহার করে ডেটা "প্যাক" করতে পারেন। struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };। বেশিরভাগ সংকলক একটি সম্পূর্ণ বরাদ্দ দেবে unsigned int, তবে আপনি যখন পড়বেন / লিখবেন তখন তারা নিজেরাই বিট-টুইডলিংয়ের সাথে ডিল করে। এছাড়াও তারা নিজেরাই মডুলো অপারেশনগুলির সাথে ডিল করে। এটি একটি unsigned small : 4বৈশিষ্ট্যের 0 এবং 15 এর মধ্যে একটি মান রয়েছে, এবং যখন এটি 16 এ পাওয়া উচিত, এটি পূর্ববর্তী বিটটি ওভাররাইট করতে পারে না :)
ম্যাথিউ এম।

উত্তর:


208

কারণ সিপিইউ কোনও বাইটের চেয়ে ছোট কিছু সম্বোধন করতে পারে না।


10
অভি, এখন যে বিশ্রী স্যার
Asm

31
আসলে, চার এক্স 86 নির্দেশাবলী bt, bts, btrএবং btc পারেন একক বিট অ্যাড্রেস!
ফ্রেডওভারফ্লো

11
আমি মনে করি btএকটি বাইট অফসেটকে সম্বোধন করে এবং তারপরে নির্বিশেষে আপনি কোনও বাইটে যান এমন কোনও ঠিকানা নির্দিষ্ট করার সময় কোনও বিট অফসেটে বিটটি পরীক্ষা করে ... বিট অফসেট লিটারালগুলি কিছুটা শব্দযুক্ত ( শ্লেষকে ক্ষমা করে) দেবে।
ব্যবহারকারী 7116

2
@ সিক্স: আপনি একটি রেজিস্ট্রারে অ্যারের শুরুটি লোড করতে পারেন এবং তারপরে আপেক্ষিক "বিট অফসেট" একটি সেকেন্ডে রাখতে পারেন। বিট অফসেটটি "এক বাইটের মধ্যে" সীমাবদ্ধ নয়, এটি কোনও 32 বিট সংখ্যা হতে পারে।
ফ্রেডওভারফ্লো

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

32

উইকিপিডিয়া থেকে :

Orতিহাসিকভাবে, একটি বাইট হ'ল কম্পিউটারে টেক্সটের একক অক্ষরকে এনকোড করতে ব্যবহৃত বিটগুলির সংখ্যা এবং এটি এই কারণেই হয় অনেক কম্পিউটার আর্কিটেকচারের মৌলিক ঠিকানাযোগ্য উপাদান

তাই বাইট মৌলিক Addressable ইউনিট , যা নিচের কম্পিউটার আর্কিটেকচার ঠিকানা পারবে না। এবং যেহেতু (সম্ভবত) কম্পিউটার নেই যা 4-বিট বাইট সমর্থন করে, তাই আপনার 4 বিট ইত্যাদি নেই bool

তবে, আপনি যদি এমন একটি আর্কিটেকচার ডিজাইন করতে পারেন যা 4-বিটকে বেসিক অ্যাড্রেসিয়েবল ইউনিট হিসাবে সম্বোধন করতে পারে, তবে আপনার boolকেবলমাত্র সেই কম্পিউটারে 4-বিট আকারের হবে !


4
"তখন আপনার কম্পিউটারে কেবল আকার 4-বিট হবে" - না আপনি তা করবেন না, কারণ স্ট্যান্ডার্ডের মধ্যে CHAR_BIT 8 বছরের কম হওয়া থেকে নিষেধ করা হয়েছে, তবে যদি স্থাপত্যের ঠিকানাযোগ্য ইউনিট 8 বিটের চেয়ে কম হয়, তবে একটি সি ++ প্রয়োগের জন্য কেবল একটি মেমরি মডেল উপস্থাপন করতে হবে যা অন্তর্নিহিত হার্ডওয়্যারের মেমরির মডেল থেকে আলাদা।
স্টিভ জেসোপ

@ স্টিভ: ওফ ... আমি সেটিকে উপেক্ষা করেছি। সরানো হয়েছে intএবং charআমার পোস্ট থেকে।
নওয়াজ

1
আপনার কোনও 4-বিট থাকতে boolপারে না, কারণ আর্কিটেকচারটি নিজের অপকডগুলি দিয়ে কী সম্বোধন করতে পারে তা নির্বিশেষে সি ++ এর মধ্যেchar ক্ষুদ্রতম ঠিকানাযোগ্য ইউনিট । কমপক্ষে 1 টির মান থাকতে হবে এবং সংলগ্ন বস্তুর অবশ্যই সি ++ এ তাদের নিজস্ব ঠিকানা থাকতে হবে , সুতরাং বাস্তবায়নটি কেবল তাদের আরও বড় এবং মেমরির অপচয় করতে হবে। একারণে বিট ক্ষেত্রগুলি একটি বিশেষ কেস হিসাবে বিদ্যমান: কোনও স্ট্রাক্টের বিটফিল্ড সদস্যদের আলাদাভাবে সম্বোধন করার প্রয়োজন হয় না, তাই এগুলি একটির চেয়ে ছোট হতে পারে (যদিও পুরো কাঠামো এখনও তা হতে পারে না)। sizeof(bool)boolchar
স্টিভ জেসোপ

@ স্টিভ জেসোপ: এটি আকর্ষণীয় বলে মনে হচ্ছে। আপনি দয়া করে আমাকে ভাষা স্পেসিফিকেশন থেকে রেফারেন্স দিতে পারেন যেখানে এটি charসি ++ এর মধ্যে সবচেয়ে ছোট ঠিকানাযোগ্য ইউনিট বলে ?
নওয়াজ

3
নিকটতম নির্দিষ্ট বিবৃতি সম্ভবত 9.৯ / ৪: "টাইপ টি-এর একটি অবজেক্টের অবজেক্টের উপস্থাপনা হ'ল এন স্বাক্ষরিত চরিত্রের অবজেক্টের ক্রম টি টাইপ টি এর অবজেক্ট দ্বারা নেওয়া, যেখানে এন সমান আকারের (টি)"। স্পষ্টতই sizeof(bool)0.5 :-) হতে পারে না আমি মনে করি কোনও বাস্তবায়ন বৈধভাবে একটি এক্সটেনশন হিসাবে সাব-বাইট পয়েন্টার সরবরাহ করতে পারে তবে সাধারণ উপায়ে বরাদ্দ করা বুলের মতো "সাধারণ" অবজেক্টগুলি স্ট্যান্ডার্ড যা বলে তাই করতে হবে।
স্টিভ জেসোপ

12

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

তবে সি ++ তে বিট-আকারের বরাদ্দ ব্যবহার করা সম্ভব। বিট ভেক্টরগুলির জন্য স্ট্যান্ড :: ভেক্টর বিশেষীকরণ রয়েছে এবং বিট আকারের এন্ট্রি গ্রহণের জন্য স্ট্রাক্টও রয়েছে।


1
নিশ্চিত না যে আমি সম্মতি জানাব যে বিটওয়াইজ অপারেশনগুলি ধীর। Ands, nots, xors ইত্যাদি খুব দ্রুত। এটি সাধারণত ধীরে ধীরে বিটওয়াইজ অপারেশনগুলির বাস্তবায়ন। মেশিন পর্যায়ে এগুলি বেশ দ্রুত। শাখা ... এখন ধীর।
হোগান

3
কেবল এটি আরও স্পষ্ট করার জন্য, আপনি যদি বুলিয়ানগুলির একটি ভেক্টর তৈরি করেন এবং এটিতে 24 বুলিয়ান রাখেন তবে এটি কেবল 3 বাইট লাগবে (3 * 8)। আপনি যদি আরেকটি বুলিয়ান রাখেন তবে এটি অন্য একটি বাইট লাগবে। তবুও, আপনি যদি অন্য বুলিয়ান ধাক্কা দেন তবে এটি কোনও অতিরিক্ত বাইট নেবে না কারণ এটি শেষ বাইটে "ফ্রি" বিট ব্যবহার করে
পেড্রো ল্যারিও

হ্যাঁ, আমিও কামড়ের দিকের কাজগুলি ধীরগতির বিষয়ে সন্দেহ করি :)
পেড্রো

বিট ভেক্টর বিট-আকারের বরাদ্দ তৈরি করে না। তারা বাইট-আকারের বরাদ্দ তৈরি করে। একটি বিট বরাদ্দ করা সম্ভব নয়।
জন ডিবলিং

1
কিছুটা ভেক্টরে একটি বিট পড়ার জন্য তিনটি অপারেশন দরকার: শিফট এবং এবং অন্য একটি শিফ্ট। লেখালেখি দুটো। যেখানে পৃথক বাইটগুলি একক দিয়ে অ্যাক্সেস করা যায়।
সুকরু

7

পুরানো দিনগুলিতে যখন আমাকে রাগের ঝলকানি দিয়ে স্কুলে যেতে হয়েছিল, চড়াই উতরাই ছিল এবং দুপুরের খাবারের মধ্য দিয়ে আমরা যে প্রাণীটিকে স্কুলের পিছনে বনের মধ্যে ট্র্যাক করতে পেরেছিলাম এবং খালি হাতে হত্যা করতে পারি, কম্পিউটারের চেয়ে স্মৃতি খুব কম ছিল আজ. আমি প্রথম যে কম্পিউটারটি ব্যবহার করেছি সেটিতে 6K র‌্যাম ছিল। 6 মেগাবাইট নয় 6 গিগাবাইট নয় 6 কিলোবাইট আছে। সেই পরিবেশে, যতটা বুলিয়ান আপনি পারা যায় তেমন প্যাক করার পক্ষে এটি প্রচুর পরিমাণে অনুভূত হয়েছিল এবং তাই আমরা সেগুলি বের করে আনার জন্য নিয়মিত অপারেশন ব্যবহার করব use

আজ, যখন লোকেরা আপনাকে কেবল 1 গিগাবাইট র‌্যাম থাকার কারণে আপনাকে বিদ্রূপ করবে, এবং 200 গিগাবাইটেরও কম সংখ্যক হার্ড ড্রাইভ পাওয়া যায় এমন এক জায়গা যেখানে পুরানো জিনিস রয়েছে, তখন বিটগুলি প্যাক করা কোনও সমস্যা নয়।


পতাকা নিয়ে কাজ করার সময় বাদে। কোনও কিছুর উপর একাধিক বিকল্প নির্ধারণের মতো বিষয়গুলি ... যেমন। 00000001 + 00000100 = 00000101.
আর্মস্ট্রোনস্ট

@ অ্যাটমিক্স: আমি আর কখনও এটি করি না। আমার দুটি পতাকা লাগলে আমি দুটি বুলিয়ান ক্ষেত্র তৈরি করি। আমি কোড লিখতাম যেখানে আমি এই জাতীয় পতাকা প্যাক করে তারপরে "if flags & 0x110! = 0 তারপর" বা এর মত লিখি তবে এটি রহস্যজনক এবং আজকাল আমি সাধারণত পৃথক ক্ষেত্র তৈরি করে লিখি "if fooFlag || barFlag" " পরিবর্তে. যে কারণে পতাকাগুলি প্যাকিং করা কোনও কারণের জন্য ভাল তবে আমি সেই সম্ভাবনার বিষয়টি প্রত্যাখ্যান করব না, তবে আগের মতো স্মৃতি সংরক্ষণ করার দরকার নেই।
জয়

2
প্রকৃতপক্ষে, বিটগুলি প্যাক করা আপনার সমস্যাটি যথেষ্ট মূল্যবান, যদি আপনি চান যে আপনার গণনা দ্রুত হয় - সেই বিশাল পরিমাণে ডেটা যা আপনি মেমরিতে সঞ্চয় করেন। বুলিয়ান প্যাকিং কেবল ছোট স্টোরেজের জন্য নয় - এর অর্থ আপনি আপনার বুলিয়ান ইনপুট অ্যারেগুলি প্যাক করা অবস্থায় 8 বার দ্রুত (ব্যান্ডউইথের বিবেচনায়) পড়তে পারেন এবং এটি প্রায়শই যথেষ্ট তাৎপর্যপূর্ণ। এছাড়াও, আপনি বিপ অপারেশন যেমন পপসি (জনসংখ্যা গণনা) ব্যবহার করতে পারেন যা সিপিইউতে আপনার কাজকে গতি দেয়।
einpoklum

2
সত্যিই বিপুল সংখ্যক বুলিয়ান হ'ল আপনি যদি প্রতিদিন এটির সাথে কাজ করেন তবে: ডিবিএমএস, মেশিন লার্নিং, বৈজ্ঞানিক সিমুলেশন এবং অন্যান্য সামগ্রীর সম্পূর্ণ হোস্ট। এবং - কেবল তাদের উপর কাজ করা মানে তাদের অনুলিপি করা - মেমরি থেকে ক্যাশে into এক মিলিয়ন বুল কিছুই নয়, ভাবুন বিলিয়ন।
einpoklum

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

6

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

আমার অভিজ্ঞতা অনুসারে একমাত্র অ্যাপ্লিকেশন যা বেশ কয়েকটি বালকে একক বাইটে প্যাক করতে বিরক্ত করে is


5

আপনি উপ আকারের পূর্ণসংখ্যা পেতে বিট ক্ষেত্রগুলি ব্যবহার করতে পারেন।

struct X
{
    int   val:4;   // 4 bit int.
};

যদিও এটি সাধারণত হার্ডওয়্যার প্রত্যাশিত বিট নিদর্শনগুলির জন্য কাঠামোগত মানচিত্র করতে ব্যবহৃত হয়:

struct SomThing   // 1 byte value (on a system where 8 bits is a byte
{
    int   p1:4;   // 4 bit field
    int   p2:3;   // 3 bit field
    int   p3:1;   // 1 bit
};

5

কারণ একটি বাইট ভাষাতে ক্ষুদ্রতম ঠিকানাযোগ্য একক।

তবে আপনি উদাহরণস্বরূপ বুলটিকে 1 বিট নিতে পারেন যদি আপনার কাছে সেগুলির একটি গুচ্ছ থাকে। একটি কাঠামোতে, এই মত:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};

2

boolএক বাইট হতে পারে - সিপিইউর সবচেয়ে ছোট ঠিকানাযোগ্য আকার বা বড় হতে পারে। পারফরম্যান্সের উদ্দেশ্যে boolআকার হওয়াটা অস্বাভাবিক কিছু নয় int। নির্দিষ্ট উদ্দেশ্যে যদি (হার্ডওয়্যার সিমুলেশন বলুন) আপনার জন্য এন বিট সহ একটি প্রকারের প্রয়োজন হয় তবে আপনি তার জন্য একটি লাইব্রেরি পেতে পারেন (যেমন জিবিএল লাইব্রেরির BitSet<N>ক্লাস রয়েছে)। আপনি যদি আকারের সাথে উদ্বিগ্ন হন bool(আপনার কাছে সম্ভবত একটি বড় ধারক রয়েছে), তবে আপনি নিজেরাই বিটগুলি প্যাক করতে পারেন বা std::vector<bool>এটি আপনার জন্য এটি ব্যবহার করতে পারেন (এটি পরে ধারক প্রয়োজনীয়তাগুলি পূরণ করে না বলে পরবর্তী সতর্কতা অবলম্বন করুন)।


2

আপনি কীভাবে এটি আপনার এমুলেটর স্তরে বাস্তবায়ন করবেন তা চিন্তা করুন ...

bool a[10] = {false};

bool &rbool = a[3];
bool *pbool = a + 3;

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);

2

কারণ সাধারণভাবে, সিপিইউ 1 বাইটের সাথে মেমরি বরাদ্দ করে মৌলিক ইউনিট হিসাবে, যদিও এমপিএসের মতো কিছু সিপিইউ 4-বাইট শব্দ ব্যবহার করে।

তবে প্রতিটি বুলের জন্য এক বিট দিয়ে বিশেষ ফ্যাশনে vectorডিল বরাদ্দ করা হয়।boolvector<bool>


1
আমি বিশ্বাস করি এমনকি এমআইপিএস সিপিইও আপনাকে পৃথক বাইটে অ্যাক্সেস দেবে, যদিও এখানে পারফরম্যান্স পেনাল্টি রয়েছে।
পল টমবলিন

@ পল: হ্যাঁ আপনি ঠিক বলেছেন, তবে সাধারণত শব্দ-নির্দিষ্ট lw/ swআরও বেশি ব্যবহৃত হয়।
রায়ান লি

এমআইপিএস সম্পর্কে জানেন না, তবে আইএ -৪৪ আর্কিটেকচার কেবল 64৪-বিট সীমানায় অ্যাক্সেসের অনুমতি দেয়।
জিন বুশুয়েভ

0

বাইট হ'ল একটি কম্পিউটারের ডিজিটাল ডেটা সঞ্চয় করার ছোট একক। একটি কম্পিউটারে র‌্যামের কয়েক মিলিয়ন বাইট থাকে এবং যার যার ঠিকানা রয়েছে। প্রতিটি বিটের জন্য যদি এটির ঠিকানা থাকে তবে কোনও কম্পিউটার 8 বারের চেয়ে কম র‌্যাম পরিচালনা করতে পারে যা এটি পারে।

আরও তথ্য: উইকিপিডিয়া


0

ন্যূনতম আকারটি 1 বাইট হলেও, আপনার কাছে 1 বাইটে 8 বিট বুলিয়ান তথ্য থাকতে পারে:

http://en.wikipedia.org/wiki/Bit_array

জুলিয়া ভাষার উদাহরণস্বরূপ বিটআরে রয়েছে এবং আমি সি ++ বাস্তবায়ন সম্পর্কে পড়েছি।

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