জাভাতে ডাবল টিলড (~~) অর্থ কী?


192

পেয়ারাটির সোর্স কোডটি ব্রাউজ করার সময় আমি নীচের কোডটির কয়েকটি অংশটি দেখতে পেলাম ( hashCodeঅভ্যন্তরীণ শ্রেণীর প্রয়োগের অংশ CartesianSet):

int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
    adjust *= 31;
    adjust = ~~adjust;
    // in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
    hash = 31 * hash + (size() / axis.size() * axis.hashCode());

    hash = ~~hash;
}
hash += adjust;
return ~~hash;

দুজনেই adjustএবং hashহয় intগুলি। আমি জাভা সম্পর্কে যা জানি তার থেকে ~বিটওয়াইজ অবহেলা, সুতরাং adjust = ~~adjustএবং hash = ~~hashভেরিয়েবলগুলি অপরিবর্তিত রাখা উচিত। ছোট পরীক্ষা চালানো (অবশ্যই সুনির্দিষ্ট দৃ as়তার সাথে),

for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
    assert i == ~~i;
}

এটি নিশ্চিত করে ধরে নিই যে পেয়ারা ছেলেরা জানে যে তারা কী করছে, তাদের অবশ্যই এটি করার একটি কারণ থাকতে হবে। প্রশ্নটা কী?

সম্পাদনা মন্তব্যগুলিতে যেমন উল্লেখ করা হয়েছে, উপরের পরীক্ষায় iসমান পরিমাণের ক্ষেত্রে অন্তর্ভুক্ত নেই Integer.MAX_VALUE। যেহেতু i <= Integer.MAX_VALUEসর্বদা সত্য, আমাদের এটিকে চিরতরে লুপিং থেকে রোধ করার জন্য লুপের বাইরে কেসটি পরীক্ষা করা দরকার। তবে, লাইন

assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;

সংকলক সতর্কতা প্রদান করে "তুল্য অভিন্ন ভাবগুলি" তুলনা করে, যা এটি বেশ নখ করে।


42
এই মুহূর্তে @dr_andonuts পেয়ারা একটি প্রকল্পের অন্তর্ভুক্ত করার জন্য একটি দুর্দান্ত স্ট্যান্ডার্ড গ্রন্থাগার - আমার মনে হয় দূরে দৌড়ানোর পরামর্শটি ভুল জায়গায় স্থান পেয়েছে।
ysavit

4
দৃ় প্রান্তটি কেসটি পরীক্ষা করে না Integer.MAX_VALUE। সাথে বৈপরীত্য -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
ফ্রাঙ্কি

3
পুনঃটুইট করেছেন -Integer.MIN_VALUEচারপাশে মোড়ানো Integer.MIN_VALUE, তাই অবহেলা করা যে আবার সহজভাবে Integer.MIN_VALUEআবার উত্পাদন করে ।

2
@ মাআর্টিনাস, @ এইচভিডি, এটি নির্দেশ করার জন্য ধন্যবাদ thanks এখন আমি মনে আছে -x = (~x) + 1
ফ্র্যাঙ্কি

7
@ ডিআর_এন্ডোনটস ট্রোলিং? আপনি যে জিনিসগুলি বুঝতে পারছেন না সেগুলি থেকে কেন পালাবেন। আপনাকে এখানে শিখতে সহায়তা করার জন্য স্ট্যাক ওভারফ্লো এখানে এটি।
জ্যারেড বুড়ো

উত্তর:


245

জাভাতে, এর অর্থ কিছুই নেই।

তবে সেই মন্তব্যে বলা হয়েছে যে লাইনটি বিশেষত জিডাব্লুটিটির জন্য, যা জাভা স্ক্রিপ্টে জাভা সংকলনের একটি উপায় is

জাভাস্ক্রিপ্টে, পূর্ণসংখ্যা হ'ল ধরণের দ্বিগুণ-সেই-অ্যাক্ট-অ্যাস-ইন্টিজারগুলির মতো। উদাহরণস্বরূপ তাদের সর্বোচ্চ 2 ^ 53 মূল্য রয়েছে। কিন্তু বিটওয়াইজ অপারেটররা সংখ্যাগুলি এমনভাবে আচরণ করে যেন তারা 32-বিট হয়, যা আপনি এই কোডটিতে চান ঠিক। অন্য কথায়, জাভাস্ক্রিপ্টে "32-বিট নম্বর হিসাবে ~~hashবিবেচনা করুন" বলে hash। বিশেষত, এটি নীচের 32 বিট ব্যতীত সমস্ত কিছু বাদ দেয় (যেহেতু বিটওয়াইস ~অপারেটরগুলি কেবল নীচের 32 বিটগুলিতে দেখায়), যা জাভার ওভারফ্লো কীভাবে কাজ করে তার সমান।

আপনার যদি তা না থাকে তবে জাভা-স্থলে বা জাভাস্ক্রিপ্ট জমিতে (একটি জিডাব্লুটি সংকলনের মাধ্যমে) মূল্যায়ন করা আছে তার উপর নির্ভর করে অবজেক্টের হ্যাশ কোডটি ভিন্ন হবে।


10
@ শারিড এটি জিডব্লিউটি জিনিস নয়, এটি জাভাস্ক্রিপ্টের জিনিস। এখন এই সংখ্যাটি সেই ভাষায় কাজ করে।
ysavit

18
@ আইশভিট তবে জাভাতে সংখ্যাগুলি কীভাবে কাজ করে তা তা নয় । জিডাব্লুটিটি যদি এই সত্যটি আড়াল করে না যে ব্যবহারকারীর কাছ থেকে নম্বরগুলি জেএসে এবং জেভিএমে পৃথকভাবে প্রয়োগ করা হয়, তবে এটি প্রকৃতপক্ষে একটি সংকলক।
ভালদারম্যান

8
@ হোল্ড, হ্যাঁ, এটি জাভাস্ক্রিপ্ট যা সঠিকভাবে পূর্ণসংখ্যার প্রয়োগ করে (জাভাস্ক্রিপ্টে কোনও পূর্ণসংখ্যার ধরণের মতো আসলে কিছুই নেই)।
মাইক দ্য লাইয়ার

8
@ ওয়াল্ডারম্যান এটি একটি ভাল বিষয়। এড করা |0বা ~~শব্দগুলি যুক্ত করা শক্ত হবে না যদিও পারফরম্যান্স হিটটি কী হবে তা আমি জানি না (আপনাকে প্রতিটি প্রকাশের প্রতিটি পদক্ষেপে এটি যুক্ত করতে হবে)। ডিজাইনের বিবেচনাগুলি কী ছিল তা আমি জানি না। FWWW, অসঙ্গতি GWT এর সামঞ্জস্য পৃষ্ঠায় নথিভুক্ত করা হয় ।
ysavit

6
hashCodeএটি অদ্ভুত যে এটি ইচ্ছাকৃতভাবে আদালত করেছে, বা এমনকি প্রত্যাশাও রয়েছে যে ওভারফ্লো হবে। আপনি কেবলমাত্র অসঙ্গতি পর্যবেক্ষণ করতে পারেন এমন জায়গা যেখানে সাধারণ জাভা ইন্টিফ্লো হবে, যা বেশিরভাগ কোডে উঠে আসে এমন কোনও সমস্যা নয়; এটি এই এক অদ্ভুত ক্ষেত্রে কেবল প্রাসঙ্গিক।
লুই ওয়াসারম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.