JavaRush /جاوا بلاگ /Random-UR /جاوا میں بٹ وائز آپریشنز

جاوا میں بٹ وائز آپریشنز

گروپ میں شائع ہوا۔
آپ شاید لفظ "بیٹ" سے واقف ہوں گے۔ اگر نہیں تو آئیے جانتے ہیں :) کمپیوٹر میں معلومات کی پیمائش کی کم از کم اکائی بٹ ہے۔ اس کا نام انگریزی " binary digit " - "binary number" سے آیا ہے۔ تھوڑا سا دو نمبروں میں سے ایک کے طور پر ظاہر کیا جا سکتا ہے: 1 یا 0۔ ایک خاص نمبر کا نظام ہے جو کہ ایک اور صفر پر مبنی ہے - بائنری۔ ہم ریاضی کے جنگل میں نہیں جائیں گے اور صرف یہ نوٹ کریں کہ جاوا میں کسی بھی نمبر کو اس کی بائنری شکل میں تبدیل کیا جا سکتا ہے۔ ایسا کرنے کے لیے آپ کو ریپر کلاسز استعمال کرنے کی ضرورت ہے۔ بٹ وائز آپریشنز - 1مثال کے طور پر، نمبر کے لیے اسے کیسے کرنا ہے int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
کنسول آؤٹ پٹ:

101010110
1010 10110 (میں نے پڑھنے کے قابل جگہ شامل کی ہے) بائنری میں نمبر 342 ہے۔ ہم نے اصل میں اس نمبر کو انفرادی بٹس - صفر اور ایک میں تقسیم کیا ہے۔ یہ ان کے ساتھ ہے کہ ہم بٹ وائز نامی آپریشن انجام دے سکتے ہیں۔
  • ~- بٹ وائز "نہیں" آپریٹر۔

یہ بہت آسان کام کرتا ہے: یہ ہمارے نمبر کے ہر ایک حصے سے گزرتا ہے اور اس کی قدر کو اس کے برعکس تبدیل کرتا ہے: صفر سے ایک، ایک سے صفر۔ اگر ہم اسے اپنے نمبر 342 پر لاگو کرتے ہیں، تو ہمیں یہ ملتا ہے: 101010110 - بائنری 010101001 میں نمبر 342 - اظہار کا نتیجہ ~342 لیکن چونکہ ایک int متغیر 4 بائٹس لیتا ہے، یعنی 32 بٹس، درحقیقت، متغیر میں نمبر اس طرح محفوظ ہوتا ہے: 00000000 00000000 00000001 01010110- جاوا میں int قسم کے متغیر میں نمبر 342 11111111 11111111 11111110 10101001- java میں ~342 اظہار کا نتیجہ آئیے اسے عملی طور پر کرنے کی کوشش کرتے ہیں:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
کنسول آؤٹ پٹ:
11111111111111111111111010101001
  • &- بٹ وائز آپریٹر "اور"

جیسا کہ آپ دیکھ سکتے ہیں، یہ منطقی "AND" ( &&) سے کافی ملتا جلتا لکھا گیا ہے۔ آپریٹر &&، جیسا کہ آپ کو یاد ہے، trueصرف اس صورت میں واپس آتا ہے جب دونوں آپرینڈس درست ہوں۔ Bitwise &اسی طرح کام کرتا ہے: یہ دو نمبروں کا تھوڑا سا موازنہ کرتا ہے۔ اس موازنہ کا نتیجہ تیسرا نمبر ہے۔ مثال کے طور پر، آئیے نمبرز 277 اور 432 لیں: 100010101 - نمبر 277 بائنری شکل میں 110110000 - نمبر 432 بائنری شکل میں اگلا، آپریٹر &اوپری نمبر کے پہلے بٹ کا موازنہ نیچے والے نمبر کے پہلے بٹ سے کرتا ہے۔ چونکہ یہ ایک "AND" آپریٹر ہے، نتیجہ 1 کے برابر ہو گا صرف اسی صورت میں جب دونوں بٹس 1 کے برابر ہوں۔ دیگر تمام صورتوں میں، نتیجہ 0 ہو گا۔ 100010101 & 110110000 _______________ 100010000 - کام کا نتیجہ & ہم پہلے پہلے بٹس کا موازنہ ایک دوسرے کے ساتھ دو نمبروں کا، پھر دوسرا بٹس، تیسرا، وغیرہ۔ جیسا کہ آپ دیکھ سکتے ہیں، صرف دو صورتوں میں 1 (پہلے اور پانچویں بٹس) کے برابر نمبروں میں دونوں بٹس تھے۔ دیگر تمام موازنہوں کا نتیجہ 0 تھا۔ اس لیے آخر میں ہمیں نمبر 100010000 ملا۔ اعشاریہ نظام میں، یہ نمبر 272 سے مطابقت رکھتا ہے۔ آئیے چیک کریں:
public class Main {

   public static void main(String[] args) {
       System.out.println(277&432);
   }
}
کنسول آؤٹ پٹ:

272
  • |- بٹ وار "یا"۔ آپریشن کا اصول ایک ہی ہے - ہم دو نمبروں کا تھوڑا سا موازنہ کرتے ہیں۔ صرف اب اگر کم از کم بٹس میں سے ایک 1 کے برابر ہو تو نتیجہ 1 کے برابر ہو گا۔ آئیے انہی نمبروں کو دیکھتے ہیں - 277 اور 432:
100010101 | 110110000 _______________ 110110101 - کام کا نتیجہ۔ | یہاں نتیجہ مختلف ہے: صرف وہی بٹس جو دونوں نمبروں میں زیرو تھے صفر رہے۔ کام کا نتیجہ نمبر 110110101 ہے۔ اعشاریہ نظام میں یہ نمبر 437 سے مطابقت رکھتا ہے۔ آئیے چیک کریں:
public class Main {

   public static void main(String[] args) {
       System.out.println(277|432);
   }
}
کنسول آؤٹ پٹ:

437
ہم نے ہر چیز کو صحیح طریقے سے شمار کیا! :)
  • ^- bitwise exclusive OR (جسے XOR بھی کہا جاتا ہے)
ہم نے پہلے کبھی ایسے آپریٹر کا سامنا نہیں کیا۔ لیکن اس میں کوئی پیچیدہ بات نہیں ہے۔ یہ ایک باقاعدہ "یا" کی طرح لگتا ہے۔ فرق ایک ہے: trueاگر کم از کم ایک آپرینڈ سچ ہے تو عام "یا" واپس آتا ہے۔ لیکن ضروری نہیں کہ ایک ہو - اگر دونوں موجود ہیں true- تو نتیجہ true۔ لیکن خصوصی "یا" trueصرف اس صورت میں واپس آتا ہے جب آپرینڈز میں سے کوئی ایک درست ہو۔ اگر دونوں کام درست ہیں تو، ایک باقاعدہ "یا" واپس آئے گا true("کم از کم ایک سچ ہے")، لیکن ایک خصوصی یا واپس آئے گا false۔ اسی لیے اسے خصوصی کہا جاتا ہے۔ پچھلے بٹ وائز آپریشنز کے اصول کو جانتے ہوئے، آپ شاید آسانی سے 277^432 آپریشن خود کر سکتے ہیں۔ لیکن آئیے ایک بار پھر مل کر بہتر طریقے سے اس کا پتہ لگائیں :) 100010101 ^ 110110000 _______________ 010100101 - کام کا نتیجہ ^ یہاں ہمارا نتیجہ ہے۔ وہ بٹس جو دونوں نمبروں میں ایک جیسے تھے 0 واپس آئے ("میں سے ایک" فارمولہ کام نہیں کرتا تھا)۔ لیکن جن لوگوں نے 0-1 یا 1-0 کا جوڑا بنایا وہ آخر کار اکائی میں بدل گیا۔ نتیجے کے طور پر، ہمیں نمبر 010100101 ملا۔ اعشاریہ کے نظام میں، یہ نمبر 165 سے مساوی ہے۔ آئیے دیکھتے ہیں کہ کیا ہم نے صحیح حساب کیا:
public class Main {

   public static void main(String[] args) {
       System.out.println(277^432);
   }
}
کنسول آؤٹ پٹ:

165
سپر! سب کچھ ویسا ہی ہے جیسا کہ ہم نے سوچا تھا :) اب وقت آگیا ہے کہ بٹ شفٹ نامی کارروائیوں سے واقف ہوں۔ نام، اصول میں، خود کے لئے بولتا ہے. ہم کچھ نمبر لیں گے اور اس کے بٹس کو بائیں اور دائیں منتقل کریں گے :) آئیے دیکھتے ہیں کہ یہ کیسا لگتا ہے:

بائیں شفٹ کریں۔

بٹس کی بائیں شفٹ نشانی سے ظاہر ہوتی ہے << مثال:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(Integer.toBinaryString(x));
       System.out.println(Integer.toBinaryString(z));
   }
}
اس مثال میں، نمبر کو x=64قدر کہا جاتا ہے۔ یہ اس کے بٹس ہیں جو ہم شفٹ کریں گے۔ ہم بٹس کو بائیں طرف شفٹ کریں گے (اس کا تعین نشان کی سمت سے کیا جا سکتا ہے <<) بائنری سسٹم میں نمبر 64 = 1000000 نمبر کو y=3مقدار کہا جاتا ہے۔ مقدار اس سوال کا جواب دیتی ہے کہ "ایک نمبر کے بٹس کو کتنے بٹس کو دائیں/بائیں منتقل کیا جانا چاہئے x؟" ہماری مثال میں، ہم انہیں 3 بٹس بائیں طرف شفٹ کریں گے۔ شفٹ کے عمل کو مزید واضح کرنے کے لیے، آئیے تصویر کو دیکھتے ہیں۔ ہماری مثال میں ہم قسم int کے نمبر استعمال کرتے ہیں۔ Intکمپیوٹر میموری کے 32 بٹس پر قبضہ کرتا ہے۔ ہمارا اصل نمبر 64 ایسا لگتا ہے: بٹ وائز آپریشنز - 2اور اب ہم لفظ کے لغوی معنی میں، اپنے ہر بٹ کو لے کر اسے 3 خلیات کے ذریعے بائیں طرف شفٹ کرتے ہیں: بٹ وائز آپریشنز - 3یہ وہی ہے جو ہمیں ملا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں، ہمارے تمام بٹس شفٹ ہو گئے ہیں، اور حد سے باہر سے مزید 3 صفر شامل کیے گئے ہیں۔ 3 - کیونکہ ہم 3 سے شفٹ ہو رہے تھے۔ اگر ہم 10 سے شفٹ ہو رہے تھے تو 10 صفر جوڑے جائیں گے۔ لہذا اظہار x << yکا مطلب ہے "ایک عدد y سیل کے بٹس کو хبائیں طرف منتقل کریں۔" ہمارے اظہار کا نتیجہ نمبر 1000000000 تھا، جو اعشاریہ نظام میں 512 کے برابر ہے۔ آئیے چیک کریں:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
کنسول آؤٹ پٹ:

512
یہ ٹھیک ہے! نظریہ میں، بٹس کو غیر معینہ مدت تک منتقل کیا جا سکتا ہے۔ لیکن چونکہ ہمارے پاس نمبر ہے int، صرف 32 سیل دستیاب ہیں۔ ان میں سے 7 پہلے ہی نمبر 64 (1,000,000) کے زیر قبضہ ہیں۔ لہذا، اگر ہم، مثال کے طور پر، بائیں طرف 27 شفٹ کرتے ہیں، تو ہماری واحد اکائی حد سے باہر ہو جائے گی اور "اوور رائٹ" ہو جائے گی۔ صرف صفر رہ جائیں گے!
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 26;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
کنسول آؤٹ پٹ:

0
جیسا کہ ہم نے توقع کی تھی، ایک 32 بٹ سیلز سے آگے نکل گیا اور غائب ہو گیا۔ ہمیں ایک 32 بٹ نمبر ملا جس میں صرف صفر شامل ہیں۔ بٹ وائز آپریشنز - 4قدرتی طور پر، اعشاریہ نظام میں یہ 0 کے مساوی ہے۔ بائیں شفٹوں کو یاد رکھنے کا ایک سادہ اصول: ہر بائیں شفٹ کے ساتھ، نمبر کو 2 سے ضرب دیا جاتا ہے۔ مثال کے طور پر، آئیے بٹس کے ساتھ تصویروں کے بغیر اظہار کے نتائج کا حساب لگانے کی کوشش کرتے ہیں۔ 111111111 << 3 ہمیں ضرورت ہے۔ نمبر 111111111 کو 2 سے تین گنا ضرب دیں، نتیجے کے طور پر، ہمیں 888888888 ملتا ہے۔ آئیے کوڈ لکھیں اور چیک کریں:
public class Main {

   public static void main(String[] args) {
       System.out.println(111111111 << 3);
   }
}
کنسول آؤٹ پٹ:

888888888

دائیں تبدیلیاں

وہ نشانی سے ظاہر ہوتے ہیں >>۔ وہ ایک ہی کام کرتے ہیں، صرف دوسری سمت میں! :) آئیے وہیل کو دوبارہ ایجاد نہ کریں اور اسی نمبر int 64 کے ساتھ ایسا کرنے کی کوشش کریں۔
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 2;//quantity

       int z = (x >> y);
       System.out.println(z);
   }
}
بٹ وائز آپریشنز - 5بٹ وائز آپریشنز - 62 سے دائیں طرف شفٹ ہونے کے نتیجے میں، ہمارے نمبر کے دو انتہائی صفر حد سے باہر چلے گئے اور مٹ گئے۔ ہمیں نمبر 10000 ملا، جو اعشاریہ نظام میں نمبر 16 سے مساوی ہے۔ کنسول میں آؤٹ پٹ:

16
دائیں شفٹوں کو یاد رکھنے کا ایک سادہ اصول: ہر دائیں شفٹ کو دو سے تقسیم کیا جاتا ہے، کسی بھی بقیہ کو چھوڑ کر۔ مثال کے طور پر، 35 >> 2 اس کا مطلب یہ ہے کہ ہمیں 35 کو 2 سے 2 بار تقسیم کرنے کی ضرورت ہے، بقیہ کو ضائع کرتے ہوئے 35/2 = 17(بقیہ 1 کو مسترد کرتے ہوئے) 17:2 = 8(بقیہ 1 کو مسترد کرتے ہوئے) کل 35 >> 28 کے برابر ہونا چاہیے۔ چیک کریں:
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
کنسول آؤٹ پٹ:

8

جاوا میں آپریشنز کی ترجیح

جیسا کہ آپ کوڈ لکھتے یا پڑھتے ہیں، آپ کو اکثر ایسے تاثرات نظر آئیں گے جن میں ایک ساتھ کئی آپریشن کیے جاتے ہیں۔ یہ سمجھنا بہت ضروری ہے کہ انہیں کس ترتیب میں انجام دیا جائے گا، ورنہ نتیجہ غیر متوقع ہو سکتا ہے۔ چونکہ جاوا میں بہت سے آپریشنز ہیں، ان سب کو ایک خاص ٹیبل میں الگ کیا گیا تھا:

آپریٹر کی ترجیح

آپریٹرز مقدم
پوسٹ فکس expr++ expr--
unary ++expr --expr +expr ~ !
ضرب * / %
اضافی + -
شفٹ << >> >>>
رشتہ دار < > <= >=کی مثال
مساوات == !=
bitwise اور &
bitwise خصوصی OR ^
bitwise inclusive OR |
منطقی اور &&
منطقی OR ||
ٹرنری ? :
تفویض = += -= *= /= %= &= ^= |= <<= >>= >>>=
تمام آپریشنز بائیں سے دائیں انجام دیئے جاتے ہیں، لیکن ان کی ترجیح کو مدنظر رکھتے ہوئے. مثال کے طور پر، اگر ہم لکھتے ہیں: int x = 6 - 4/2; پہلے ڈویژن آپریشن (4/2) کیا جائے گا۔ اگرچہ وہ قطار میں دوسرے نمبر پر ہے، لیکن اس کی ترجیح زیادہ ہے۔ قوسین یا مربع بریکٹ کسی بھی ترجیح کو زیادہ سے زیادہ میں تبدیل کرتے ہیں۔ آپ کو شاید یہ اسکول سے یاد ہوگا۔ مثال کے طور پر، اگر آپ انہیں کسی اظہار میں شامل کرتے ہیں: int x = (6 - 4)/2; گھٹاؤ پہلے کیا جائے گا، کیونکہ اس کا حساب قوسین میں کیا جاتا ہے۔ منطقی آپریٹر کی &&ترجیح کم ہوتی ہے، جیسا کہ ٹیبل سے دیکھا جا سکتا ہے۔ لہذا، اکثر یہ آخری پھانسی دی جائے گی. مثال کے طور پر: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; اس اظہار کو اس طرح انجام دیا جائے گا:
  • 4/2 = 2

    boolean x = 6 - 2 > 3 && 12*12 <= 119;
  • 12*12 = 144

    boolean x = 6 - 2 > 3 && 144 <= 119;
  • 6-2 = 4

    boolean x = 4 > 3 && 144 <= 119;
  • اگلا موازنہ آپریٹرز کو پھانسی دی جائے گی:

    4 > 3 = true

    boolean x = true && 144 <= 119;
  • 144 <= 119 = false

    boolean x = true && false;
  • اور آخر کار، آخری آپریٹر کو پھانسی دے دی جائے گی &&۔

    boolean x = true && false;

    boolean x = false;

    اضافی آپریٹر ( +) مثال کے طور پر، موازنہ آپریٹر !=("برابر نہیں") سے زیادہ فوقیت رکھتا ہے؛

    لہذا اظہار میں:

    boolean x = 7 != 6+1;

    پہلے آپریشن 6+1 کیا جائے گا، پھر چیک 7!=7 (غلط)، اور آخر میں نتیجہ falseمتغیر کو تفویض کیا جائے گا x۔ اسائنمنٹ کی عام طور پر تمام کارروائیوں میں سب سے کم ترجیح ہوتی ہے - ٹیبل میں دیکھیں۔

افف! ہمارا لیکچر طویل تھا، لیکن آپ نے یہ کر دیا! اگر آپ اس اور پچھلے لیکچرز کے کچھ حصوں کو پوری طرح سے نہیں سمجھتے ہیں، تو پریشان نہ ہوں، ہم مستقبل میں ان موضوعات کو ایک سے زیادہ بار چھوئیں گے۔ یہاں آپ کے لیے کچھ مفید لنکس ہیں:
  • منطقی آپریٹرز - جاوا رش کا منطقی آپریشنز پر لیکچر۔ ہم جلد ہی ان تک نہیں پہنچیں گے، لیکن آپ انہیں ابھی پڑھ سکتے ہیں، کوئی نقصان نہیں ہوگا۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION