পেয়ারাটির সোর্স কোডটি ব্রাউজ করার সময় আমি নীচের কোডটির কয়েকটি অংশটি দেখতে পেলাম ( 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;
সংকলক সতর্কতা প্রদান করে "তুল্য অভিন্ন ভাবগুলি" তুলনা করে, যা এটি বেশ নখ করে।
Integer.MAX_VALUE। সাথে বৈপরীত্য -(-Integer.MIN_VALUE) != Integer.MIN_VALUE।
-Integer.MIN_VALUEচারপাশে মোড়ানো Integer.MIN_VALUE, তাই অবহেলা করা যে আবার সহজভাবে Integer.MIN_VALUEআবার উত্পাদন করে ।
-x = (~x) + 1।