বিট শিফটিং অপারেটররা ঠিক তাদের নামটি বোঝায় do তারা বিট শিফট। বিভিন্ন শিফট অপারেটরগুলির একটি সংক্ষিপ্ত (বা না-তাই সংক্ষিপ্ত) পরিচয় এখানে।
অপারেটররা
>>
পাটিগণিত (বা স্বাক্ষরিত) ডান শিফট অপারেটর।
>>>
লজিকাল (বা স্বাক্ষরবিহীন) ডান শিফট অপারেটর।
<<
বাম শিফট অপারেটর এবং লজিকাল এবং পাটিগণিত উভয় বদল প্রয়োজন meets
এই অপারেটরদের সকল পূর্ণসংখ্যা মান প্রয়োগ করা যেতে পারে ( int
, long
, সম্ভবত short
এবং byte
বা char
)। কিছু ভাষায়, শিফট অপারেটরগুলিকে অপারেটরকে int
স্বয়ংক্রিয়ভাবে আকার হিসাবে পরিবর্তিত করে তুলনায় ছোট কোনও ডেটাটাইপগুলিতে প্রয়োগ করা হয় int
।
দ্রষ্টব্য যে <<<
কোনও অপারেটর নয়, কারণ এটি অনর্থক হবে।
এছাড়াও লক্ষ করুন যে সি এবং সি ++ ডান শিফট অপারেটরগুলির মধ্যে পার্থক্য করে না । এগুলি কেবল >>
অপারেটর সরবরাহ করে এবং ডান-শিফটিং আচরণ হ'ল স্বাক্ষরিত ধরণের জন্য নির্ধারিত বাস্তবায়ন। উত্তরটির বাকি অংশগুলি সি # / জাভা অপারেটরগুলি ব্যবহার করে।
(সমস্ত মূলধারার সি এবং সি ++ জিসিসি এবং ঝনঝন / LLVM সহ বাস্তবায়নের সালে >>
স্বাক্ষরিত ধরনের গাণিতিক কিছু কোডটির এই অনুমান, কিন্তু এটা কিছু মান নিশ্চয়তা নয় এটা না।। Undefined , যদিও; মান এটা এক সংজ্ঞায়িত করতে বাস্তবায়নের প্রয়োজন উপায় বা অন্য কোনও। তবে, নেতিবাচক স্বাক্ষরযুক্ত সংখ্যার বাম শিফ্টগুলি হ'ল সংজ্ঞায়িত আচরণ (স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লো) So সুতরাং আপনার গাণিতিক ডান শিফ্ট না লাগলে সাধারণত স্বাক্ষরবিহীন ধরণের সাথে আপনার বিট-শিফটিং করা ভাল idea
বাম শিফ্ট (<<)
পূর্ণসংখ্যা বিটগুলির একটি সিরিজ হিসাবে, মেমরিতে সঞ্চয় করা হয়। উদাহরণস্বরূপ, 32-বিট হিসাবে সঞ্চিত 6 নম্বরটি হ'ল int
:
00000000 00000000 00000000 00000110
এই বিট প্যাটার্নটি বাম এক অবস্থানে ( 6 << 1
) স্থানান্তরিত করার ফলে 12 নম্বর হবে:
00000000 00000000 00000000 00001100
আপনি দেখতে পাচ্ছেন, অঙ্কগুলি এক অবস্থানের দ্বারা বামে সরে গেছে এবং ডানদিকে শেষ সংখ্যাটি একটি শূন্য দিয়ে পূর্ণ হবে। এছাড়াও আপনি নোট হতে পারে নাড়াচাড়া বাম 2. সুতরাং ক্ষমতা গুণ সমতূল্য 6 << 1
সমতূল্য 6 * 2
, এবং 6 << 3
সমতূল্য 6 * 8
। একটি ভাল অনুকূলকরণ সংকলক সম্ভব হলে শিফ্টের সাথে গুণগুলি প্রতিস্থাপন করবে।
অ-বৃত্তাকার স্থানান্তর
দয়া করে মনে রাখবেন এগুলো না বৃত্তাকার বদল আনতে। এই মানটিকে এক অবস্থান ( 3,758,096,384 << 1
) দ্বারা বামে স্থানান্তর করা :
11100000 00000000 00000000 00000000
3,221,225,472 এ ফলাফল:
11000000 00000000 00000000 00000000
"শেষের দিকে" স্থানান্তরিত হওয়া অঙ্কটি হারিয়ে যায়। এটি চারপাশে মোড়ানো হয় না।
লজিকাল ডান শিফট (>>>)
একটি লজিকাল ডান শিফটটি বাম শিফটের সাথে কথোপকথন। বাম দিকে বিটগুলি সরানোর পরিবর্তে, তারা কেবল ডানদিকে চলে যায়। উদাহরণস্বরূপ, 12 নম্বর স্থানান্তরিত:
00000000 00000000 00000000 00001100
এক অবস্থানে ডানদিকে ( 12 >>> 1
) আমাদের আসল 6 ফিরে আসবে:
00000000 00000000 00000000 00000110
সুতরাং আমরা দেখতে পাই যে ডান দিকে সরে যাওয়া 2 এর শক্তি দ্বারা বিভাজনের সমান।
হারানো বিট চলে গেছে
তবে, একটি শিফট "হারানো" বিটগুলি পুনরায় দাবি করতে পারে না। উদাহরণস্বরূপ, যদি আমরা এই প্যাটার্নটি স্থানান্তর করি:
00111000 00000000 00000000 00000110
বাম 4 পজিশনে ( 939,524,102 << 4
), আমরা 2,147,483,744 পেয়েছি:
10000000 00000000 00000000 01100000
এবং তারপরে পিছন ফিরে ( (939,524,102 << 4) >>> 4
) আমরা পেয়েছি 134,217,734:
00001000 00000000 00000000 00000110
একবার বিটস হারিয়ে গেলে আমরা আমাদের আসল মানটি ফিরে পেতে পারি না।
পাটিগণিত ডান শিফট (>>)
পাটিগণিত ডান শিফট হ'ল লজিকাল রাইট শিফ্টের মতো, শূন্যের সাথে প্যাডিংয়ের পরিবর্তে, এটি সর্বাধিক উল্লেখযোগ্য বিট দিয়ে প্যাড করে। এটি কারণ সর্বাধিক উল্লেখযোগ্য বিট হ'ল সাইন বিট, বা বিট যা ইতিবাচক এবং negativeণাত্মক সংখ্যার পার্থক্য করে। সর্বাধিক উল্লেখযোগ্য বিটের সাথে প্যাডিংয়ের মাধ্যমে, গাণিতিক ডান শিফটটি সাইন-সংরক্ষণ করা।
উদাহরণস্বরূপ, আমরা যদি এই বিট প্যাটার্নটিকে negativeণাত্মক সংখ্যা হিসাবে ব্যাখ্যা করি:
10000000 00000000 00000000 01100000
আমাদের সংখ্যাটি -2,147,483,552 রয়েছে। পাটিগণিত শিফট (-2,147,483,552 >> 4) দিয়ে ডান 4 পজিশনে এ স্থানান্তর করা আমাদের দেবে:
11111000 00000000 00000000 00000110
বা নম্বর -134,217,722।
সুতরাং আমরা দেখতে পাচ্ছি যে আমরা লজিকাল ডান শিফ্টের পরিবর্তে পাটিগণিত ডান শিফটটি ব্যবহার করে আমাদের নেতিবাচক সংখ্যার চিহ্নটি সংরক্ষণ করেছি। এবং আবারও, আমরা দেখতে পাচ্ছি যে আমরা 2 এর ক্ষমতা দিয়ে বিভাগ সম্পাদন করছি।