পেয়ারাটির সোর্স কোডটি ব্রাউজ করার সময় আমি নীচের কোডটির কয়েকটি অংশটি দেখতে পেলাম ( 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
।