উত্তর:
>>
গাণিতিক শিফটটি ডান, >>>
লজিকাল শিফটটি সঠিক।
একটি গাণিতিক শিফটে, সংখ্যার স্বাক্ষর সংরক্ষণের জন্য সাইন বিট বাড়ানো হয়।
উদাহরণস্বরূপ: -২ টি 8 11111110
বিটে উপস্থাপিত হবে (কারণ সর্বাধিক উল্লেখযোগ্য বিটের নেতিবাচক ওজন রয়েছে)। পাটিগণিতের শিফট ব্যবহার করে একে একে ডান স্থানান্তর করা আপনাকে দেবে 11111111
, বা -1। লজিকাল ডান শিফট, তবে, মূল্য সম্ভবত একটি স্বাক্ষরযুক্ত সংখ্যা প্রতিনিধিত্ব করতে পারে যে যত্ন করে না; এটি কেবল সমস্ত কিছু ডান দিকে নিয়ে যায় এবং বাম দিক থেকে 0 সেকেন্ড দিয়ে পূর্ণ করে। লজিকাল শিফট ব্যবহার করে আমাদের -2 ডান এক বিট স্থানান্তর করবে 01111111
।
2^k
, আমি এটিকে অদ্ভুত বলে মনে করি যে এটিই সবার উত্তর। বিটের একটি স্ট্রিং কোনও সংখ্যা নয় এবং বিটগুলির যে >>
কোনও স্ট্রিংয়ে সর্বদা ব্যবহৃত হতে পারে: বিটগুলির স্ট্রিং যে ভূমিকা পালন করে এবং তাতে 'সাইন' ধারণাটি রয়েছে কিনা তা নির্বিশেষে সর্বদা একই কাজ করে। আপনার অপারেন্ডকে স্বাক্ষরযুক্ত সংখ্যা হিসাবে ব্যাখ্যা করা হচ্ছে না, তখন কেসটি নিয়ে আলোচনা করে আপনার ইতিমধ্যে দুর্দান্ত উত্তরটি প্রসারিত করা কি ঠিক হবে ? আমার অভিযোগ কি বোধগম্য?
String
হিসাবে বিবেচনা করা যেতে পারে char[]
। তিনি বলছেন না যে char
একটি সংখ্যা নয়; তিনি কেবল বলছেন যে এটি একটি স্বাক্ষরবিহীন নম্বর। আমার মনে হয় সেটাই সে হারিয়ে গেছে।
>>>
স্বাক্ষরবিহীন শিফট; এটি 0 প্রবেশ করানো হবে।>>
হবে স্বাক্ষরিত, এবং সাইন বিট প্রসারিত হবে।
শিফ্ট অপারেটরগুলির মধ্যে বাম শিফট
<<
, স্বাক্ষর করা ডান শিফট>>
এবং স্বাক্ষরবিহীন ডান শিফট অন্তর্ভুক্ত রয়েছে>>>
।এর মান
n>>s
হয়n
ডান-স্থানান্তরিতs
সঙ্গে বিট অবস্থানের সাইন-এক্সটেনশন ।এর মান
n>>>s
হয়n
ডান-স্থানান্তরিতs
সঙ্গে বিট অবস্থানের শূন্য এক্সটেনশন ।
System.out.println(Integer.toBinaryString(-1));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >> 16));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >>> 16));
// prints "1111111111111111"
ইতিবাচক অংশটি যুক্ত করে জিনিসগুলিকে আরও স্পষ্ট করতে
System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"
যেহেতু এটি ইতিবাচক, স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন শিফট উভয়ই বেশিরভাগ ক্ষেত্রে বামে 0 যোগ করবে।
1 >>> 32 == 1
তারা উভয় ডান শিফট, কিন্তু >>>
হয়unsigned
ডকুমেন্টেশন থেকে :
স্বাক্ষরবিহীন ডান শিফট অপারেটর ">>>" শূন্যকে বামতম অবস্থানে স্থানান্তরিত করে, যখন ">>" এর পরে বাম দিকের অবস্থানটি সাইন এক্সটেনশনের উপর নির্ভর করে।
>>>
এটি স্বাক্ষরবিহীন, তবে কেন 7>>32=7
? আমি একটি লুপ চালিয়েছিলাম যা একবারে একটি শিফট করে এবং 32
শিফট পরে , এটি ফিরে আসে 7
। এটি বোঝার একমাত্র উপায় হ'ল প্রতিটি সংখ্যার স্থানান্তরিত হওয়ার জন্য এটি একটি "বাহ্যিক বৃত্ত" এ প্রবেশ করেছিল। 32
শিফট করার পরে , এটি একরকম ফিরে এসে তার অবস্থানে পৌঁছেছে, তবে স্পষ্টতই এখনও তা বোঝা যায় না। কি হচ্ছে?
লজিকাল ডান শিফট ( v >>> n
) একটি মান প্রদান করে যাতে বিটগুলি বিট পজিশনে v
ডানদিকে স্থানান্তরিত হয় n
এবং 0 টি বাম দিক থেকে স্থানান্তরিত হয়। বাইনারি লিখিত 8-বিট মান স্থানান্তর বিবেচনা করুন:
01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000
যদি আমরা বিটকে একটি স্বাক্ষরবিহীন nonnegative পূর্ণসংখ্যার হিসাবে ব্যাখ্যা করি, লজিকাল ডান শিফটটির সাথে 2 এর সামর্থ্য দ্বারা সংখ্যাটি বিভক্ত করার প্রভাব রয়েছে তবে যাইহোক, সংখ্যাটি যদি দুইটির পরিপূরক উপস্থাপনায় থাকে, লজিকাল ডান শিফটটি সঠিকভাবে নেতিবাচক সংখ্যাকে বিভক্ত করে না । উদাহরণস্বরূপ, উপরের দ্বিতীয় ডান শিফটটি 128 থেকে 32 শিফটে বিটগুলি স্বাক্ষরযুক্ত সংখ্যা হিসাবে ব্যাখ্যা করলে are তবে এটি -128 থেকে 32-এ স্থানান্তরিত হয় যখন জাভাতে সাধারণ হিসাবে বিটগুলি দুটিটির পরিপূরক হিসাবে ব্যাখ্যা করা হয়।
অতএব, আপনি যদি দুটি জনের দ্বারা বিভাজনের জন্য স্থানান্তরিত হন তবে আপনি পাটিগণিতের ডান শিফট ( v >> n
) চান। এটি এমন একটি মান প্রদান করে যার মধ্যে বিটগুলি বিট অবস্থানের v
দ্বারা ডানদিকে সরানো হয়েছে এবং বাম দিকের বামদিকের বিটেরn
অনুলিপিগুলি বাম দিক থেকে স্থানান্তরিত হয়েছে:
01111111 >> 2 = 00011111
10000000 >> 2 = 11100000
বিটগুলি যখন দুটি এর পরিপূরক উপস্থাপনায় একটি সংখ্যা হয়, তখন গাণিতিক ডান শিফটে দু'জনের পাওয়ার দ্বারা বিভাজন ঘটে। এটি কাজ করে কারণ বাম দিকের বিটটি হ'ল সাইন বিট। দু'জনের পাওয়ার দ্বারা ভাগ করা অবশ্যই চিহ্নটি একই রাখবে।
বিটওয়াইস এবং বিট শিফট অপারেটরদের সম্পর্কে আরও পড়ুন
>> Signed right shift
>>> Unsigned right shift
বিট প্যাটার্নটি বাম-হাতের ক্রিয়াকলাপ দ্বারা দেওয়া হয়েছে এবং ডান-হাত অপারেন্ড দ্বারা স্থান পরিবর্তন করার অবস্থান। স্বাক্ষরবিহীন ডান শিফট অপারেটর >>>
একটি শূন্যকে বামতম অবস্থানে স্থানান্তরিত করে ,
যখন >>
সাইন এক্সটেনশনের উপর নির্ভর করে তার পরে বামতম অবস্থান ।
সহজ কথায় >>>
সবসময় একটি বদল শূন্য বামদিকের অবস্থানে যেহেতু >>
সংখ্যা চিহ্ন উপর ভিত্তি করে বদল আনতে অর্থাৎ ঋণাত্মক সংখ্যা 1 এবং 0 ধনাত্মক সংখ্যা জন্য।
উদাহরণস্বরূপ নেতিবাচক পাশাপাশি ইতিবাচক সংখ্যা দিয়ে চেষ্টা করুন।
int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));
System.out.println();
c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
আউটপুট:
11111111111111111111111111011001
11111111111111111111111101100100
111111111111111111111111011001
11111111111111111111111101100100
100110
10011000
100110
10011000
System.out.println(Integer.MAX_VALUE + ": " + String.format("%32s", Integer.toBinaryString(Integer.MAX_VALUE)).replace(' ', '0'))
; পূর্ণসংখ্যা.ম্যাক্স_ভ্যালু : 01111111111111111111111111111111;
পূর্ণসংখ্যা। এমএকটি ভ্যালু : 10000000000000000000000000000000;
-1 : 11111111111111111111111111111111;
0 : 00000000000000000000000000000000;
1 : 00000000000000000000000000000001
ডান শিফট লজিকাল অপারেটর ( >>> N
) বি অবস্থানগুলি ডানদিকে এন পজিশনে স্থানান্তর করে, সাইন বিটটি বাতিল করে এবং এন এর বাম-সর্বাধিক বিটকে 0 এর সাথে প্যাড করে। উদাহরণ স্বরূপ:
-1 (in 32-bit): 11111111111111111111111111111111
>>> 1
অপারেশন হয়ে যাওয়ার পরে :
2147483647: 01111111111111111111111111111111
ডান শিফট গাণিতিক অপারেটর ( >> N
) এছাড়াও এন পজিশন দ্বারা ডানদিকে বিট স্থানান্তরিত করে, তবে সাইন বিট সংরক্ষণ করে এবং এন এর বাম-সর্বাধিক বিট 1 এর সাথে প্যাড করে। উদাহরণ স্বরূপ:
-2 (in 32-bit): 11111111111111111111111111111110
>> 1
অপারেশন হয়ে যাওয়ার পরে :
-1: 11111111111111111111111111111111