ইন্টেল প্রসেসর (এবং সম্ভবত কিছু অন্য) স্টোরেজের জন্য সামান্য এন্ডিয়ান ফর্ম্যাট ব্যবহার করে।
আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়। বড় এন্ডিয়ান ফর্ম্যাটটির চেয়ে এই ফর্ম্যাটটির কোনও সুবিধা আছে কি?
ইন্টেল প্রসেসর (এবং সম্ভবত কিছু অন্য) স্টোরেজের জন্য সামান্য এন্ডিয়ান ফর্ম্যাট ব্যবহার করে।
আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়। বড় এন্ডিয়ান ফর্ম্যাটটির চেয়ে এই ফর্ম্যাটটির কোনও সুবিধা আছে কি?
উত্তর:
উভয় উপায়েই যুক্তি রয়েছে, তবে একটি বিষয় হ'ল সামান্য-এন্ডিয়ান সিস্টেমে, 32, 16 বা 8 বিট প্রস্থ হিসাবে নেওয়া মেমরির প্রদত্ত মানের ঠিকানাটি একই।
অন্য কথায়, আপনার যদি স্মৃতিতে দুটি বাইট মান থাকে:
0x00f0 16
0x00f1 0
সেই '16' কে 16-বিট মান হিসাবে (বেশিরভাগ 32-বিট সিস্টেমে 'সি' সংক্ষিপ্ত ') বা 8-বিট মান হিসাবে (সাধারণত সি' চর ') গ্রহণ করা কেবলমাত্র আপনার ব্যবহারের আনুষ্ঠানিক নির্দেশকে বদলে দেয় - আপনি যে ঠিকানাটি নিয়েছেন তা নয় থেকে।
একটি বিগ-এন্ডিয়ান সিস্টেমে, উপরোক্তগুলি এইভাবে প্রকাশিত হয়েছে:
0x00f0 0
0x00f1 16
আপনাকে পয়েন্টারটি বৃদ্ধি করতে হবে এবং তারপরে নতুন মানটিতে সংকীর্ণ আনতে হবে operation
সুতরাং, সংক্ষেপে, 'লিটল এন্ডিয়ান সিস্টেমে, ক্যাসেটগুলি কোনও অপ-বিকল্প নয়।'
আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়।
বিগ-এন্ডিয়ান এবং লিটল-এন্ডিয়ান হ'ল মানুষের দৃষ্টিভঙ্গি থেকে কেবল "স্বাভাবিক আদেশ" এবং "বিপরীত ক্রম" এবং তারপরে এই সবগুলি সত্য হলেই ...
সেগুলি হ'ল সমস্ত মানবিক কনভেনশন যা কোনও সিপিইউতে মোটেই গুরুত্ব দেয় না। আপনি যদি # 1 এবং # 2 ধরে রাখেন এবং # 3 ফ্লিপ করেন তবে লিটল-এন্ডিয়ান হ'ল আরবি বা হিব্রু পড়তে এমন লোকদের কাছে "একেবারে প্রাকৃতিক" বলে মনে হয়, যা ডান থেকে বামে লেখা থাকে।
এবং অন্যান্য মানব সম্মেলনগুলি রয়েছে যেগুলি বড় আকারের করে তোলে যা অপ্রাকৃত বলে মনে হয়, যেমন ...
ফিরে যখন আমি বেশিরভাগ 68K এবং পাওয়ারপিসি প্রোগ্রাম করতাম, আমি বড়-এন্ডিয়ানকে "ডান" এবং ছোট্ট এন্ডিয়ানকে "ভুল" বলে মনে করি। তবে যেহেতু আমি আরও এআরএম এবং ইন্টেলের কাজ করছি, তাই আমি ছোট-এন্ডিয়ানদের অভ্যস্ত হয়ে পড়েছি। আসলেই কিছু যায় আসে না।
ঠিক আছে, এখানে কারণ হিসাবে এটি আমাকে ব্যাখ্যা করেছে: সংযোজন এবং বিয়োগফল
আপনি যখন বহু-বাইট সংখ্যা যুক্ত বা বিয়োগ করবেন তখন আপনাকে কমপক্ষে উল্লেখযোগ্য বাইট দিয়ে শুরু করতে হবে। উদাহরণস্বরূপ আপনি যদি দুটি 16-বিট সংখ্যা যুক্ত করে থাকেন তবে সর্বনিম্ন উল্লেখযোগ্য বাইট থেকে সর্বাধিক তাৎপর্য্য বাইট পর্যন্ত একটি ক্যারি থাকতে পারে, তাই ক্যারি রয়েছে কিনা তা দেখতে আপনাকে কমপক্ষে উল্লেখযোগ্য বাইট দিয়ে শুরু করতে হবে। লংহ্যান্ড সংযোজন করার সময় আপনি ঠিক একই অঙ্কটি শুরু করেছিলেন। আপনি বাম থেকে শুরু করতে পারবেন না।
একটি 8-বিট সিস্টেম বিবেচনা করুন যা মেমরি থেকে ধারাবাহিকভাবে বাইটগুলি নিয়ে আসে। যদি এটি প্রথমে সর্বনিম্ন উল্লেখযোগ্য বাইট আনে, এটি সর্বাধিক উল্লেখযোগ্য বাইট মেমরি থেকে আনার সময় এটি করা শুরু করতে পারে । এই সমান্তরালতা হ'ল সিস্টেমের মতো সামান্য এডিয়ানগুলিতে পারফরম্যান্স আরও ভাল। যদি উভয় বাইট স্মৃতি থেকে আনার জন্য অপেক্ষা করতে হয় বা বিপরীত ক্রমে এনেছিল তবে এটি বেশি সময় নিতে পারে।
এটি পুরানো 8-বিট সিস্টেমে রয়েছে। একটি আধুনিক সিপিইউতে আমি সন্দেহ করি যে বাইট ক্রমের ফলে কোনও তফাত আসে এবং আমরা কেবল historicalতিহাসিক কারণে সামান্য এডিয়ান ব্যবহার করি।
8 বিট প্রসেসরের সাহায্যে এটি অবশ্যই আরও কার্যকর ছিল, আপনি বিভিন্ন কোডের প্রয়োজন ছাড়াই এবং অতিরিক্ত মান বাফার না করেই একটি 8 বা 16 বিট অপারেশন করতে পারবেন।
আপনি যদি কোনও সময়ে বাইট নিয়ে কাজ করে থাকেন তবে কিছু সংযোজন ক্রিয়াকলাপগুলির পক্ষে এটি আরও ভাল।
তবে বিগ-এন্ডিয়ান বেশি প্রাকৃতিক হওয়ার কোনও কারণ নেই - ইংরেজিতে আপনি তেরটি (ছোট এন্ডিয়ান) এবং তেইশটি (বিগ এন্ডিয়ান) ব্যবহার করেন
0x12345678
সংরক্ষণ করা 78 56 34 12
হয় 12 34 56 78
(বাইট 0 বাম দিকে থাকে, বাইট 3 ডানদিকে থাকে)। নোটটি কত বড় (বিটের শর্তে) এটি তত বেশি অদলবদলের প্রয়োজন; একটি ওয়ার্ডের জন্য একটি বদলের প্রয়োজন; একটি ডিডাব্লর্ড, দুটি পাস (তিনটি মোট সোয়াপ); একটি কিউবিআরডির তিনটি পাস (মোট মোট 7) এবং আরও। যে, (bits/8)-1
অদলবদল। আরেকটি বিকল্প হ'ল তাদের উভয়কে সামনে এবং পিছনের দিকে পড়া (প্রতিটি বাইট ফরোয়ার্ড পড়া, তবে পুরো # পিছনের দিকে স্ক্যান করা)।
জাপানি তারিখের সম্মেলনটি "বিগ এন্ডিয়ান" - ইয়ে / মিমি / ডিডি। এটি অ্যালগরিদম বাছাইয়ের জন্য সহজ, যা সাধারণ প্রথম-অক্ষর-সবচেয়ে-উল্লেখযোগ্য নিয়মের সাথে একটি সাধারণ স্ট্রিং-তুলনা ব্যবহার করতে পারে।
সর্বাধিক তাৎপর্যপূর্ণ-ফিল্ড-প্রথম রেকর্ডে সঞ্চিত বিগ-এন্ডিয়ান সংখ্যাগুলির জন্য অনুরূপ কিছু প্রযোজ্য। ক্ষেত্রগুলির মধ্যে বাইটগুলির তাত্পর্য memcmp
ক্রমটি রেকর্ডের মধ্যে ক্ষেত্রগুলির তাত্পর্যটির সাথে মিলে যায়, তাই আপনি রেকর্ডগুলির সাথে তুলনা করতে একটি ব্যবহার করতে পারেন , আপনি দুটি লংওয়ার্ড, চারটি শব্দ বা আটটি পৃথক বাইট তুলনা করছেন কিনা তা যত্নশীল না করে।
ক্ষেত্রগুলির তাত্পর্যপূর্ণ ক্রমটি ফ্লিপ করুন এবং আপনি একই সুবিধা পাবেন তবে বড়-এন্ডিয়ানের চেয়ে স্বল্প-এডিয়ান সংখ্যার জন্য।
অবশ্যই এটির খুব কম ব্যবহারিক তাত্পর্য রয়েছে। আপনার প্ল্যাটফর্মটি বড়-এডিয়ান বা সামান্য-এডিয়ান হোক, আপনি যদি সত্যিই প্রয়োজন হয় তবে আপনি এই কৌশলটি কাজে লাগানোর জন্য রেকর্ড ক্ষেত্রগুলি অর্ডার করতে পারেন। আপনার পোর্টেবল কোড লেখার দরকার থাকলে এটি কেবল একটি ব্যথা ।
আমি ক্লাসিক আবেদনগুলির একটি লিঙ্কও অন্তর্ভুক্ত করতে পারি ...
http://tools.ietf.org/rfcmarkup?url=ftp://ftp.rfc-editor.org/in-notes/ien/ien137.txt
সম্পাদনা
একটি অতিরিক্ত চিন্তা। আমি একবার একটি বড় পূর্ণসংখ্যার লাইব্রেরি লিখেছি (আমি পারব কিনা তা দেখার জন্য) এবং তার জন্য, 32-বিট-প্রশস্ত খণ্ডগুলি সামান্য-এন্ডিয়ান অর্ডারে সংরক্ষণ করা হয়, প্ল্যাটফর্মটি কীভাবে এই খণ্ডগুলিতে বিটের আদেশ দেয় তা নির্বিশেষে। কারণগুলি ছিল ...
প্রচুর অ্যালগরিদমগুলি স্বভাবতই কমপক্ষে উল্লেখযোগ্য প্রান্তে কাজ শুরু করে এবং চায় সেগুলি মিলে যায়। উদাহরণস্বরূপ উদাহরণস্বরূপ, বহনকারী আরও এবং আরও উল্লেখযোগ্য অঙ্কগুলিতে প্রস্তাব রাখে, তাই এটি কমপক্ষে উল্লেখযোগ্য শেষের দিকে শুরু করা বুদ্ধিমান হয়ে যায়।
কোনও মান বাড়ানো বা সঙ্কুচিত করার অর্থ শেষে অংশগুলি যোগ করা / অপসারণ - খণ্ডগুলি উপরে / নীচে স্থানান্তর করার দরকার নেই। মেমরি রিলোকেশনের কারণে অনুলিপিটির এখনও প্রয়োজন হতে পারে তবে প্রায়শই হয় না।
প্রসেসরের সাথে এর কোনও সুস্পষ্ট প্রাসঙ্গিকতা নেই, অবশ্যই - যতক্ষণ না সিপিইউগুলি হার্ডওয়ার বিগ-ইন্টিজার সমর্থন দিয়ে তৈরি না করা হয়, ততক্ষণ এটি নিখুঁতভাবে একটি লাইব্রেরির জিনিস।
অন্য কারও উত্তর নেই যে এটি কেন হতে পারে, ফলাফলগুলি সম্পর্কে প্রচুর স্টাফ।
একটি 8 বিট প্রসেসর বিবেচনা করুন যা প্রদত্ত ক্লকচক্রটিতে মেমরি থেকে একটি একক বাইট লোড করতে পারে।
এখন, আপনি যদি 16 বিট মানটি লোড করতে চান, তবে (যেমন) আপনার কাছে থাকা এবং কেবলমাত্র 16 বিট রেজিস্টার - অর্থাৎ প্রোগ্রামের কাউন্টারে, এটি করার একটি সহজ উপায়:
ফলাফল: আপনি কেবল আনার অবস্থানকে বাড়িয়ে তোলেন, আপনি কেবল সর্বদা নিচের অংশের বৃহত্তর নিবন্ধে লোড করেন এবং আপনার কেবল বামদিকে স্থানান্তর করতে সক্ষম হতে হবে। (অবশ্যই, ডান স্থানান্তর করা অন্যান্য ক্রিয়াকলাপগুলির জন্য সহায়ক তাই এটি বেশ কয়েকটি সাইড শোতে))
এর ফলস্বরূপ যে 16 বিট (ডাবল বাইট) স্টাফ সর্বাধিক অর্ডার করা হয় ... সর্বনিম্ন। অর্থাৎ, ছোট ঠিকানার সর্বাধিক উল্লেখযোগ্য বাইট রয়েছে - এত বড় এন্ডিয়ান।
আপনি যদি এর পরিবর্তে সামান্য এডিয়ান ব্যবহার করে লোড করার চেষ্টা করেন, আপনাকে আপনার প্রশস্ত নিবন্ধের নীচের অংশে একটি বাইট লোড করতে হবে, তারপরে পরবর্তী বাইটটি স্টেজিং এরিয়াতে লোড করুন, এটিকে স্থানান্তর করুন এবং তারপরে এটিকে আপনার বিস্তৃত নিবন্ধের শীর্ষে পপ করুন । বা উপরের বা নীচে বাইটে নির্বাচন করে লোড করতে সক্ষম হওয়ার জন্য গেটিংয়ের আরও জটিল বিন্যাস ব্যবহার করুন।
সামান্য এন্ডিয়ান যাওয়ার চেষ্টা করার ফলাফলটি হল আপনার আরও সিলিকন (সুইচ এবং গেটস), বা আরও বেশি ক্রিয়াকলাপ প্রয়োজন।
অন্য কথায়, পুরানো দিনগুলিতে বক ফেরত পাওয়ার ক্ষেত্রে, আপনি বেশিরভাগ পারফরম্যান্স এবং ক্ষুদ্রতম সিলিকন অঞ্চলের জন্য আরও বেশি ঠাঁই পেয়েছিলেন।
আজকাল, এই কারণগুলো এবং প্রায় কাছাকাছি অপ্রাসঙ্গিক কিন্তু পাইপলাইন ভরাট ভালো জিনিস হতে পারে এখনও একটি বড় চুক্তি একটি বিট হতে।
যখন এস / ডব্লু লেখার কথা আসে তখন অল্প ইন্ডিয়ান অ্যাড্রেসিং ব্যবহার করার সময় জীবন প্রায়শই সহজ হয়।
(এবং বিট-ইন-বাইটের ক্ষেত্রে বড় এন্ডিয়ান প্রসেসরগুলি বাইট অর্ডারিং এবং সামান্য এন্ডিয়ান হিসাবে প্রবণতা রয়েছে But তবে কিছু প্রসেসর অদ্ভুত এবং বিগ অর্ডারের পাশাপাশি বিগ অর্ডারিং বিগ অর্ডারও ব্যবহার করবে This এটি জীবনকে খুব সুন্দর করে তোলে এইচ / ডাব্লু ডিজাইনারের জন্য মেমরি-ম্যাপযুক্ত পেরিফেরিয়াল যুক্ত করার জন্য আকর্ষণীয় তবে এটি প্রোগ্রামারটির অন্য কোনও পরিণতি নয়))
জিমওয়াইস একটি ভাল পয়েন্ট তৈরি। আরেকটি সমস্যা আছে, সামান্য এডিয়ানতে আপনি নিম্নলিখিতটি করতে পারেন:
byte data[4];
int num=0;
for(i=0;i<4;i++)
num += data[i]<<i*8;
OR
num = *(int*)&data; //is interpreted as
mov dword data, num ;or something similar it has been some time
প্রোগ্রামারদের জন্য আরও সোজা ফরোয়ার্ড যা স্মৃতিতে অদলবদল হওয়া অবস্থানগুলির সুস্পষ্ট অসুবিধা দ্বারা প্রভাবিত হয় না। আমি ব্যক্তিগতভাবে বড় এডিয়ানকে স্বাভাবিকের থেকে বিপরীত হতে দেখি :)। 12 টি সংরক্ষণ এবং 21 হিসাবে লেখা উচিত
for(i=0; i<4; i++) { num += data[i] << (24 - i * 8); }
অনুরূপ move.l data, num
।
আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়
দশমিক সংখ্যা বড় এন্ডিয়ান লেখা হয়। আপনি এটি ইংরেজিতে কীভাবে লিখেন তাও আপনি সর্বাধিক উল্লেখযোগ্য অঙ্ক এবং পরবর্তী সর্বাধিক উল্লেখযোগ্য থেকে সবচেয়ে গুরুত্বপূর্ণ হিসাবে শুরু করেন। যেমন
1234
এক হাজার দুইশত চৌত্রিশটি।
এইভাবে বড় এন্ডিয়ানকে কখনও কখনও প্রাকৃতিক ক্রম বলা হয়।
সামান্য এডিয়ান ভাষায়, এই সংখ্যাটি এক, বিশ, তিনশ এবং চার হাজার হবে।
তবে, আপনি যখন যোগ বা বিয়োগের মতো পাটিগণিত সম্পাদন করেন, আপনি শেষ দিয়ে শুরু করবেন।
1234
+ 0567
====
আপনি 4 এবং 7 দিয়ে শুরু করুন, সর্বনিম্ন অঙ্কটি লিখুন এবং ক্যারিটি মনে রাখবেন। তারপরে আপনি 3 এবং 6 ইত্যাদি যোগ করুন, বিয়োগ বা তুলনা করার জন্য এটি প্রয়োগ করা সহজ, যদি আপনার ইতিমধ্যে মেমরিটি ক্রম অনুসারে পড়ার যুক্তি থাকে, যদি নম্বরগুলি বিপরীত হয়।
বড় এড়িয়ানকে এইভাবে সমর্থন করতে আপনার বিপরীতে মেমরি পড়ার জন্য যুক্তি প্রয়োজন, অথবা আপনার আরআইএসসি প্রক্রিয়া রয়েছে যা কেবল রেজিস্টারে চালিত হয়। ;)
অনেকগুলি ইন্টেল x86 / এমএডি x64 নকশা .তিহাসিক।
বিগ-এন্ডিয়ান কিছু ক্রিয়াকলাপের জন্য দরকারী (সমান অক্টেট দৈর্ঘ্যের স্প্রিংগুলিকে মনে রাখার জন্য "বিগাইনস" এর তুলনা)। অন্যদের জন্য লিটল-এডিয়ান (সম্ভবত দুটি "বিগাইনাম" যুক্ত করুন)। শেষ পর্যন্ত, এটি সিপিইউ হার্ডওয়্যারটি কীসের জন্য সেটআপ করা হয়েছে তার উপর নির্ভর করে, এটি সাধারণত এক বা অন্যটি হয় (কিছু এমআইপিএস চিপগুলি আইআইআরসি, এলই বা বিই হতে বুটটিতে পরিবর্তনযোগ্য)।
যখন কেবলমাত্র পরিবর্তনশীল দৈর্ঘ্য সহ স্টোরেজ এবং স্থানান্তর জড়িত থাকে, তবে একাধিক মান সহ কোনও গাণিতিক হয় না, তখন লে সাধারণত লেখার পক্ষে সহজ হয়, তবে বিই পড়া সহজ হয়।
আসুন একটি নির্দিষ্ট উদাহরণ হিসাবে একটি ইন-টু-স্ট্রিং রূপান্তর (এবং পিছনে) নেওয়া যাক।
int val_int = 841;
char val_str[] = "841";
যখন ইনটি স্ট্রিংয়ে রূপান্তরিত হয়, তখন সর্বনিম্ন উল্লেখযোগ্য অঙ্ক সবচেয়ে গুরুত্বপূর্ণ অঙ্কের চেয়ে উত্তোলন করা সহজ। এটি একটি সাধারণ শেষ শর্ত সহ একটি সাধারণ লুপে করা যেতে পারে।
val_int = 841;
// Make sure that val_str is large enough.
i = 0;
do // Write at least one digit to care for val_int == 0
{
// Constants, can be optimized by compiler.
val_str[i] = '0' + val_int % 10;
val_int /= 10;
i++;
}
while (val_int != 0);
val_str[i] = '\0';
// val_str is now in LE "148"
// i is the length of the result without termination, can be used to reverse it
এখন বিআর ক্রমে একই চেষ্টা করুন। সাধারণত আপনার আর একটি বিভাজকের প্রয়োজন যা নির্দিষ্ট সংখ্যার জন্য এখানে 10 এর বৃহত্তম শক্তি রাখে (এখানে 100)। আপনার অবশ্যই এটি প্রথম খুঁজে পাওয়া দরকার। আরও অনেক কিছু করতে হবে।
বিআর তে স্ট্রিং টু ইন্টার রূপান্তর করা সহজ, যখন এটি বিপরীত লিখন অপারেশন হিসাবে করা হয়। স্টোরগুলিকে সবচেয়ে গুরুত্বপূর্ণ অঙ্কটি সর্বশেষে লিখুন, সুতরাং এটি প্রথমে পড়া উচিত।
val_int = 0;
length = strlen(val_str);
for (i = 0; i < length; i++)
{
// Again a simple constant that can be optimized.
val_int = 10*val_int + (val_str[i] - '0');
}
এখন এলই ক্রমে একই করুন। আবার, আপনার একটি অতিরিক্ত ফ্যাক্টর প্রয়োজন যা 1 দিয়ে শুরু হবে এবং প্রতিটি অঙ্কের জন্য 10 দ্বারা গুণিত হবে।
সুতরাং আমি সাধারণত স্টোরের জন্য বিই ব্যবহার করতে পছন্দ করি, কারণ একটি মান ঠিক একবার লেখা হয় তবে কমপক্ষে একবার এবং সম্ভবত বহুবার পড়ে। এর সহজ কাঠামোর জন্য, আমি সাধারণত এলই তে রূপান্তর করতে রুটটিও যাই এবং তারপরে ফলাফলটি বিপরীত করি, এমনকি যদি এটি দ্বিতীয়বারের মতো মানটি লিখে দেয়।
বিই স্টোরেজের জন্য আরেকটি উদাহরণ হ'ল ইউটিএফ -8 এনকোডিং এবং আরও অনেক কিছু।