বিট শিফট অন্তর্নিহিততার উপর নির্ভর করে?


156

ধরুন আমার কাছে 'numb'=1025 [00000000 00000000 00000100 00000001]প্রতিনিধিত্ব করা নম্বর রয়েছে :

লিটল-এন্ডিয়ান মেশিনে:

00000001 00000100 00000000 00000000

বিগ-এন্ডিয়ান মেশিনে:

00000000 00000000 00000100 00000001

এখন, আমি যদি 10 বিটগুলিতে বাম শিফট প্রয়োগ করি (যেমন: অসাড় << = 10), আমার উচিত:

[এ] লিটল-এন্ডিয়ান মেশিনে:

আমি জিডিবিতে লক্ষ্য করেছি, লিটল এন্ডিয়ান বাম শিফটটি 3 টি ধাপে করে: [কেবলমাত্র প্রক্রিয়াটি আরও ভালভাবে বোঝার জন্য আমি '3' পদক্ষেপ দেখিয়েছি]

  1. নং এর চিকিত্সা করুন বিগ-এন্ডিয়ান সম্মেলনে:

    00000000        00000000        00000100    00000001
  2. বাম শিফট প্রয়োগ করুন:

    00000000        00010000        00000100        00000000
  3. লিটল-এন্ডিয়ানে পুনরায় ফলাফলের প্রতিনিধিত্ব করুন:

    00000000        00000100        00010000        00000000 

[বি]। বিগ-এন্ডিয়ান মেশিনে:

00000000        00010000        00000100        00000000

আমার প্রশ্নটি হ'ল:

আমি যদি লিটল এন্ডিয়ান কনভেনশনে সরাসরি বাম শিফট প্রয়োগ করি তবে এটি দেওয়া উচিত:

numb:

00000001 00000100 00000000 00000000

numb << 10:

00010000 00000000 00000000 00000000

তবে আসলে এটি দেয়:

00000000        00000100        00010000        00000000 

শুধুমাত্র দ্বিতীয় ফলাফলটি অর্জন করতে, আমি উপরে তিনটি অনুমানমূলক পদক্ষেপ দেখিয়েছি।

উপরের দুটি ফলাফল কেন আলাদা তা দয়া করে আমাকে ব্যাখ্যা করুন: আসল ফলাফল numb << 10প্রত্যাশিত ফলাফলের চেয়ে আলাদা।

উত্তর:


194

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

আপডেট, @ জজকে ধন্যবাদ: পাওয়ারপিসিতে ভেক্টর শিফট এবং আবর্তনগুলি এন্ডিয়ান সংবেদনশীল। আপনার ভেক্টর রেজিস্টারে একটি মান থাকতে পারে এবং একটি শিফ্ট লিটল-এন্ডিয়ান এবং বিগ-এন্ডিয়ান নিয়ে বিভিন্ন ফলাফল আনবে


4
ব্যাখ্যার জন্য ধন্যবাদ. আপনি কি দয়া করে এমন কোনও রেফারেন্সের পরামর্শ দিতে পারেন যেখানে আমি এই জাতীয় জটিলতার আরও ভাল ধারণা পেতে পারি।
সন্দীপ সিং

4
অন্তর্নিহিতা বোঝার জন্য সেরা জিনিস হ'ল এটি কোনও এমবেডড স্তরে বিভিন্ন আর্কিটেকচারে সত্যই ব্যবহার করা। যাইহোক, আমি আপনাকে এই দুটি নিবন্ধটি উল্লেখ করতে পারি: কোডেপ্রজেক্ট / কেবি / সিপি
কার্ল

3
সুতরাং আমার কোড এন্ডিয়ান নির্বিশেষে কাজ করবে ?! এটা অসাধারণ! আমি খুব চিন্তিত ছিলাম আমাকে আমার কোডটি নরকে ফিরে যেতে হবে!
মার্কাসজে

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

3
পাওয়ারপিসিতে ভেক্টর শিফট এবং আবর্তনগুলি এন্ডিয়ান সংবেদনশীল। আপনার ভেক্টর রেজিস্টারে একটি মান থাকতে পারে এবং একটি শিফ্ট লিটল-এন্ডিয়ান এবং বিগ-এন্ডিয়ান নিয়ে বিভিন্ন ফলাফল আনবে।
jwww

58

না, বিটশিফট, সি এর অন্যান্য অংশের মতো , উপস্থাপনের পরিবর্তে মানগুলির সংজ্ঞায়িত হয় । 1 দ্বারা বাম-শিফটটি 2 দ্বারা বিভাজন, ডানদিকের শিফটটি বিভাজন। (বিটওয়াইজ ক্রিয়াকলাপগুলি সর্বদা হিসাবে, স্বাক্ষর থেকে সাবধান থাকুন uns স্বাক্ষরবিহীন ইন্টিগ্রাল ধরণের জন্য সবকিছুই সুনির্দিষ্টভাবে সংজ্ঞায়িত)


1
এটি মূলত পূর্ণসংখ্যার গাণিতিক ক্ষেত্রে সত্য, তবে সি প্রতিনিধি-নির্ভর আচরণের প্রচুর পরিমাণে সরবরাহ করে।
এডমন্ড

2
@ এডমন্ড: এইচএম ... উল্লেখযোগ্যভাবে স্বাক্ষরের বাস্তবায়ন নির্দিষ্ট করা হয়নি এবং ফলস্বরূপ বিটওয়াইজ অপারেশনগুলির আচরণ (ডান-শিফ্টের মতো) এবং মডিউলো এবং বিভাজনকে বাস্তবায়নগুলি নেতিবাচক পূর্ণসংখ্যার উপর সংজ্ঞায়িত করা হয়। বাস্তবায়ন-সংজ্ঞায়িত অন্য কোন বিষয় আপনি মনে রেখেছেন?
কেরেরেক এসবি

@ কেরেকএসবি দুর্ভাগ্যক্রমে তারা নেতিবাচক পূর্ণসংখ্যার উপর ভিত্তি করে সংজ্ঞা প্রয়োগ করছে না। এগুলি C89 এ অনির্ধারিত এবং সি 99 + এ অপরিবর্তিত রয়েছে, যা খুব খারাপ ধারণা ছিল।
পাওলো বনজিনি

@ পাওলো বনজিনি: হ্যাঁ, ভাল কথা। আসলে এটি আরও উন্নত, যেহেতু এটি এই বিষয়টিকে শক্তিশালী করে যে শিফট ক্রিয়াকলাপগুলি মূল্যগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়, সম্ভবত ফলাফলটি উপস্থাপনযোগ্য না হলে সম্ভবত অপরিজ্ঞাত হয়ে থাকে এবং অন্তর্নিহিত প্রতিনিধিত্ব সম্পর্কে অনুমান করা কোনও উপকারে আসে না।
কেরেক এসবি

@ কেরেকএসবি: জিনিসটি হ'ল প্রত্যেককে ক্ষেত্রে বাম শিফটকে মূল্য হিসাবে এবং প্রতিনিধিত্ব হিসাবে উভয়ই কেসের উপর নির্ভর করে প্রতিনিধিত্ব করতে হয়। এবং স্বাক্ষরযুক্ত ইন্টিজার ব্যবহার করা অন্যান্য সমস্যার কারণ হতে পারে, উদাহরণস্বরূপ x &= -1u << 20সম্ভবত most৪- xবিট এবং int32-বিট হলে ভুল হতে পারে incor এই কারণে, জিসিসি স্বাক্ষরিত শিফ্টগুলিকে কখনও অপরিজ্ঞাত বা এমনকি অনির্ধারিত হিসাবে গণ্য করার প্রতিশ্রুতি দেয়।
পাওলো বনজিণী

5

যে কোনও শিফট নির্দেশকে প্রথমে উচ্চ-অর্ডার বিটগুলি স্থানান্তরিত করে বাম শিফট হিসাবে বিবেচনা করা হয়। যে কোনও শিফট নির্দেশকে প্রথমে নিম্ন-আদেশ বিটগুলি স্থানান্তরিত করে ডান শিফট হিসাবে বিবেচনা করা হয়। যে অর্থে, আচরণকে >>এবং <<জন্য unsignedনম্বর endianness উপর নির্ভর করে করা হবে না।


4

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

(যাইহোক, শীর্ষে উচ্চতর ঠিকানাগুলি সহ আপনি অনুভূমিকের চেয়ে উল্লম্বভাবে উল্লম্বভাবে বাইটগুলি লিখলে লিটল এন্ডিয়ান আরও বেশি অর্থবোধ করে Which যা মেমরির মানচিত্রের ডায়াগ্রামগুলি সাধারণত কীভাবে আঁকা হয় তা ঘটে happens)


2

যদিও গৃহীত উত্তরটি উল্লেখ করে যে শেষ কথা স্মৃতি দৃষ্টিভঙ্গি থেকে একটি ধারণা। তবে আমি মনে করি না যে সরাসরি প্রশ্নের উত্তর দেয়।

কিছু উত্তর আমাকে বলে যে বিটওয়াইজ অপারেশনগুলি শেষের উপর নির্ভর করে না , এবং প্রসেসর অন্য কোনও উপায়ে বাইটগুলি উপস্থাপন করতে পারে। যাইহোক, এটি কথা বলে যা শেষ কথা বিমূর্ত হয়ে যায়।

কিন্তু যখন আমরা উদাহরণস্বরূপ কাগজে কিছুটা বিটওয়াসার গণনা করি, তখন প্রথম স্থানটিতে অন্তর্নিহিতাটি বর্ণনা করার দরকার নেই? বেশিরভাগ সময় আমরা অন্তর্নিহিতাকে নিখুঁতভাবে বেছে নিই।

উদাহরণস্বরূপ, ধরুন আমাদের কাছে এই জাতীয় কোডের একটি লাইন আছে

0x1F & 0xEF

কোনও কাগজে আপনি কীভাবে ফলাফলটি গণনা করবেন?

  MSB   0001 1111  LSB
        1110 1111
result: 0000 1111

সুতরাং এখানে আমরা গণনা করতে একটি বিগ এন্ডিয়ান ফর্ম্যাট ব্যবহার করি। আপনি একই ফলাফল গণনা করতে এবং পেতে লিটল এন্ডিয়ানও ব্যবহার করতে পারেন।

বিটিডব্লিউ, যখন আমরা কোডগুলিতে সংখ্যা লিখি, আমার মনে হয় এটি একটি বিগ এন্ডিয়ান ফর্ম্যাটের মতো। 123456বা 0x1F, উল্লেখযোগ্য সংখ্যাগুলি বাম থেকে শুরু হয় from

আবার, যখনই আমরা কাগজে কোনও মানটির বাইনারি ফর্ম্যাট লিখি, আমি মনে করি আমরা ইতিমধ্যে একটি এন্ডিয়েনেস বেছে নিয়েছি এবং আমরা স্মৃতি থেকে দেখতে দেখতে মানটি দেখছি।

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

তারপর যেমন প্রশ্নের উদাহরণ হিসাবে:

numb=1025

সামান্য endian

LSB 00000001 00000100 00000000 00000000 MSB

সুতরাং এলএসবি থেকে এমএসবিতে স্থানান্তরিত << 10হবে 10bit


<< 10লিটল এন্ডিয়ান ফর্ম্যাট ধাপে ধাপে তুলনা এবং ক্রিয়াকলাপ:

MSB                                        LSB
    00000000  00000000  00000100  00000001  numb(1025)
    00000000  00010000  00000100  00000000  << 10

LSB                                        MSB
    00000000  00000100  00010000  00000000 numb(1025) << 10, and put in a Little Endian Format

LSB                                        MSB
    00000001  00000100  00000000  00000000 numb(1205) in Little Endian format
    00000010  00001000  00000000  00000000 << 1 
    00000100  00010000  00000000  00000000 << 2 
    00001000  00100000  00000000  00000000 << 3 
    00010000  01000000  00000000  00000000 << 4
    00100000  10000000  00000000  00000000 << 5
    01000000  00000000  00000001  00000000 << 6
    10000000  00000000  00000010  00000000 << 7
    00000000  00000001  00000100  00000000 << 8
    00000000  00000010  00001000  00000000 << 9
    00000000  00000100  00010000  00000000 << 10 (check this final result!)

কি দারুন! ওপি বর্ণিত হিসাবে আমি প্রত্যাশিত ফলাফল পেয়েছি!

ওপিরা যে সমস্যাগুলি প্রত্যাশিত ফলাফল পায়নি তা হ'ল:

  1. দেখে মনে হচ্ছে তিনি এলএসবি থেকে এমএসবিতে স্থানান্তরিত হননি।

  2. লিটল এন্ডিয়ান ফর্ম্যাটে বিট স্থানান্তর করার সময়, আপনার উপলব্ধি করা উচিত (godশ্বরকে ধন্যবাদ আমি এটি উপলব্ধি করি) যে:

LSB 10000000 00000000 MSB << 1হয়
LSB 00000000 00000001 MSB, না LSB 01000000 00000000 MSB

কারণ প্রতিটি ব্যক্তির জন্য 8bits, আমরা আসলে এটি একটি MSB 00000000 LSBবড় এন্ডিয়ান ফর্ম্যাটে লিখছি।

সুতরাং এটি মত

LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB


সংক্ষেপে:

  1. যদিও বিটওয়াইজ অপারেশনগুলি ব্লেব্লাব্ল্যাবাকে দূরে সরিয়ে দেওয়া হয় ... বলা হয়ে থাকে, যখন আমরা হাতের বিটওয়াইজ অপারেশনগুলি গণনা করি, তখনও কাগজে বাইনারি ফর্ম্যাটটি লিখতে গিয়ে আমরা কী অন্তর্নিহিতা ব্যবহার করছি তা আমাদের জানতে হবে। এছাড়াও আমাদের নিশ্চিত করতে হবে যে সমস্ত অপারেটর একই ধরণের ব্যবহার করে।

  2. ওপি প্রত্যাশিত ফলাফলটি পায়নি কারণ সে স্থানান্তর ভুল করেছে।

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