>>> এবং >> এর মধ্যে পার্থক্য


উত্তর:


408

>>গাণিতিক শিফটটি ডান, >>>লজিকাল শিফটটি সঠিক।

একটি গাণিতিক শিফটে, সংখ্যার স্বাক্ষর সংরক্ষণের জন্য সাইন বিট বাড়ানো হয়।

উদাহরণস্বরূপ: -২ টি 8 11111110বিটে উপস্থাপিত হবে (কারণ সর্বাধিক উল্লেখযোগ্য বিটের নেতিবাচক ওজন রয়েছে)। পাটিগণিতের শিফট ব্যবহার করে একে একে ডান স্থানান্তর করা আপনাকে দেবে 11111111, বা -1। লজিকাল ডান শিফট, তবে, মূল্য সম্ভবত একটি স্বাক্ষরযুক্ত সংখ্যা প্রতিনিধিত্ব করতে পারে যে যত্ন করে না; এটি কেবল সমস্ত কিছু ডান দিকে নিয়ে যায় এবং বাম দিক থেকে 0 সেকেন্ড দিয়ে পূর্ণ করে। লজিকাল শিফট ব্যবহার করে আমাদের -2 ডান এক বিট স্থানান্তর করবে 01111111


8
যদিও আমি একমত এবং প্রশংসা করি যে গাণিতিক শিফটগুলি স্বাক্ষরযুক্ত সংখ্যাগুলি দ্বারা গুণিত করতে ব্যবহার করা যেতে পারে 2^k, আমি এটিকে অদ্ভুত বলে মনে করি যে এটিই সবার উত্তর। বিটের একটি স্ট্রিং কোনও সংখ্যা নয় এবং বিটগুলির যে >>কোনও স্ট্রিংয়ে সর্বদা ব্যবহৃত হতে পারে: বিটগুলির স্ট্রিং যে ভূমিকা পালন করে এবং তাতে 'সাইন' ধারণাটি রয়েছে কিনা তা নির্বিশেষে সর্বদা একই কাজ করে। আপনার অপারেন্ডকে স্বাক্ষরযুক্ত সংখ্যা হিসাবে ব্যাখ্যা করা হচ্ছে না, তখন কেসটি নিয়ে আলোচনা করে আপনার ইতিমধ্যে দুর্দান্ত উত্তরটি প্রসারিত করা কি ঠিক হবে ? আমার অভিযোগ কি বোধগম্য?
জিগজি

11
আপনি কেন বলছেন যে বিটের একটি স্ট্রিং একটি সংখ্যা নয়? আপনি কি বলবেন দশমিক অঙ্কের ক্রমটি একটি সংখ্যা নয়?
Danben

4
@ এডানবেন এটি কোনও সংখ্যার কিনা তা নিয়ে আলোচনা করা যদি আপনি কোনও প্রসঙ্গে লিঙ্ক করেন তবেই তা বোধগম্য হয়। ইন্টারনেটটি যদি কেবল বিদ্যুত হয় তবে আমি সম্মতি জানাই যে একটি স্ট্রিং কেবল একটি সংখ্যা।
বিভিডিবি

1
@ উদ্যানবেন তবে বাস্তবে আমি মনে করি জিগি আসলেই (ইমো) যা উল্লেখ করেছিলেন, তা হ'ল এটিকেও এ Stringহিসাবে বিবেচনা করা যেতে পারে char[]। তিনি বলছেন না যে charএকটি সংখ্যা নয়; তিনি কেবল বলছেন যে এটি একটি স্বাক্ষরবিহীন নম্বর। আমার মনে হয় সেটাই সে হারিয়ে গেছে।
বিভিডিবি

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

102

>>>স্বাক্ষরবিহীন শিফট; এটি 0 প্রবেশ করানো হবে।>> হবে স্বাক্ষরিত, এবং সাইন বিট প্রসারিত হবে।

জেএলএস 15.19 শিফট অপারেটর

শিফ্ট অপারেটরগুলির মধ্যে বাম শিফট <<, স্বাক্ষর করা ডান শিফট >>এবং স্বাক্ষরবিহীন ডান শিফট অন্তর্ভুক্ত রয়েছে>>>

এর মান 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 যোগ করবে।

সম্পর্কিত প্রশ্নাবলী


আপনার উদাহরণগুলি না থাকলে আমি এটি পেতাম না।
এমআর 5

47

তারা উভয় ডান শিফট, কিন্তু >>>হয়unsigned

ডকুমেন্টেশন থেকে :

স্বাক্ষরবিহীন ডান শিফট অপারেটর ">>>" শূন্যকে বামতম অবস্থানে স্থানান্তরিত করে, যখন ">>" এর পরে বাম দিকের অবস্থানটি সাইন এক্সটেনশনের উপর নির্ভর করে।


12
আপনি কি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন
কাসুন সায়াম্বলাপিতীয়

1
আমিও মনে করি আপনার একটি উদাহরণ দেওয়া উচিত।
বাইসোর

আমি মনে করি >>>এটি স্বাক্ষরবিহীন, তবে কেন 7>>32=7? আমি একটি লুপ চালিয়েছিলাম যা একবারে একটি শিফট করে এবং 32শিফট পরে , এটি ফিরে আসে 7। এটি বোঝার একমাত্র উপায় হ'ল প্রতিটি সংখ্যার স্থানান্তরিত হওয়ার জন্য এটি একটি "বাহ্যিক বৃত্ত" এ প্রবেশ করেছিল। 32শিফট করার পরে , এটি একরকম ফিরে এসে তার অবস্থানে পৌঁছেছে, তবে স্পষ্টতই এখনও তা বোঝা যায় না। কি হচ্ছে?
ইয়ান লিমারতা

@ ইয়ানলিমারটা এটা না? আমি শুধু পেতে 0. ( for (int i = 7 << 1, j = 0; j < 32; j++) System.out.println(Integer.toString(i >>= 1, 2));) যদি আপনি কি বলতে চান কেন >>32নিজেই মূল মান দেখতে এই
ময়রার

আমি দুঃখিত. আমি বোঝাতে চাইছি কেন '7 >>> 32 = 7' করে।
ইয়ান লিমারটা

40

লজিকাল ডান শিফট ( 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

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


38

>>>বামদিকে সর্বদা একটি 0 রাখবে, যখন >>এর চিহ্নটি কী তার উপর নির্ভর করে 1 বা 0 রাখবে।


10

বিটওয়াইস এবং বিট শিফট অপারেটরদের সম্পর্কে আরও পড়ুন

>>      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

ধন্যবাদ। কেবলমাত্র পূর্ণসংখ্যার জন্য বিট উপস্থাপনাটি উল্লেখ করতে একটি মন্তব্য যুক্ত করতে চাই MA MAX_VALUE, পূর্ণসংখ্যা M MIN_VALUE, -1, 0, 1 । উদাহরণ: System.out.println(Integer.MAX_VALUE + ": " + String.format("%32s", Integer.toBinaryString(Integer.MAX_VALUE)).replace(' ', '0')); পূর্ণসংখ্যা.ম্যাক্স_ভ্যালু : 01111111111111111111111111111111; পূর্ণসংখ্যা। এমএকটি ভ্যালু : 10000000000000000000000000000000; -1 : 11111111111111111111111111111111; 0 : 00000000000000000000000000000000; 1 : 00000000000000000000000000000001
অ্যান্ডি ডং

6

ডান শিফট লজিকাল অপারেটর ( >>> N) বি অবস্থানগুলি ডানদিকে এন পজিশনে স্থানান্তর করে, সাইন বিটটি বাতিল করে এবং এন এর বাম-সর্বাধিক বিটকে 0 এর সাথে প্যাড করে। উদাহরণ স্বরূপ:

-1 (in 32-bit): 11111111111111111111111111111111

>>> 1অপারেশন হয়ে যাওয়ার পরে :

2147483647: 01111111111111111111111111111111

ডান শিফট গাণিতিক অপারেটর ( >> N) এছাড়াও এন পজিশন দ্বারা ডানদিকে বিট স্থানান্তরিত করে, তবে সাইন বিট সংরক্ষণ করে এবং এন এর বাম-সর্বাধিক বিট 1 এর সাথে প্যাড করে। উদাহরণ স্বরূপ:

-2 (in 32-bit): 11111111111111111111111111111110

>> 1অপারেশন হয়ে যাওয়ার পরে :

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