JavaRush /وبلاگ جاوا /Random-FA /جاوا: بیت و بایت
Viacheslav
مرحله

جاوا: بیت و بایت

در گروه منتشر شد
جاوا: بیت و بایت - 1

معرفی

اگر مردم در سیستم اعداد اعشاری شمارش کنند، کامپیوترها در سیستم باینری حساب می‌کنند. و یک برنامه نویس باید بداند که چگونه با مردم و کامپیوتر صحبت کند. این بررسی باید در این مورد کمک کند. گاهی اوقات یک دنیای کامل پشت چیزهای آشکار پنهان است. من پیشنهاد می کنم در مورد این دنیا صحبت کنیم. مثلاً 7 روز در هفته وجود دارد. حالا بیایید به این سوال پاسخ دهیم: عدد "7" چیست؟ ) اولاً یک عدد طبیعی صحیح (مثبت) است. همچنین یک عدد اعشاری است. عدد اعشاری یک عدد در سیستم اعشاری است. وقتی می گوییم "سیستم اعداد اعشاری" به این معنی است که سیستم اعداد دارای پایه 10 است . ریشه نشان می دهد که چند رقم می تواند در یک سیستم عددی معین برای نشان دادن یک عدد استفاده شود. شمارش معکوس از صفر است. بر این اساس، برای نمایش اعداد در سیستم اعداد اعشاری، از اعداد 0 تا 9 استفاده می کنیم. این خوب است، اما ما باید نه تنها تا 9، بلکه فراتر از آن را نیز بشماریم. چگونه بودن؟ مثلا عدد 10. برای نوشتن این عدد از 2 رقم استفاده می کنیم. موقعیت هر رقم در سیستم اعشاری را رقم اعشار می نامند. ارقام از راست به چپ شمرده می شوند:
جاوا: بیت و بایت - 2
علاوه بر این، عدد اعشاری را می توان به صورت زیر گسترش داد: 103 = 1*10^2 + 0*10^1 + 3*10^0
جاوا: بیت و بایت - 3
این تعداد اساساً از راست به چپ رشد می کند. یعنی ابتدا 7 بود و بعد 10 شد. بنابراین ارقام از سمت راست و از صفر شروع می شوند. این همه برای چیست؟ این به این دلیل است که ما کامپیوتر نیستیم. و در حالی که ما به صورت اعشاری (یعنی پایه 10) می شماریم، رایانه ها به صورت باینری (یعنی پایه 2) می شمارند. اما قوانینی که در این سیستم های اعداد اعمال می شود یکسان است.
جاوا: بیت و بایت - 4

سیستم دودویی

سیستم دودویی بسیار شبیه به سیستم اعشاری است، تنها با این تفاوت که حد در اینجا 10 نیست، بلکه 2 است. اجازه دهید با یک مثال مقایسه کنیم. چگونه عدد 11 را در باینری نشان می دهیم؟ این بسیار ساده است: فقط باید عدد اعشاری را بر مبنای 2 تقسیم کنید، یعنی 11/2 را در یک ستون بشمارید. مثال:
جاوا: بیت و بایت - 5
یا در اینجا مثالی از WikiHow آورده شده است:
جاوا: بیت و بایت - 6
جالب اینجاست که می‌توانیم یک عدد را به صورت دودویی مانند اعشار نشان دهیم: 111 در باینری = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
جاوا: بیت و بایت - 7
نمونه ای از تبدیل از باینری به اعشاری را می توان در ماشین حساب آنلاین مشاهده کرد . با صحبت از این واقعیت که قوانین عملکرد در سیستم های اعداد یکسان است، بیایید به جمع در سیستم باینری نگاه کنیم:
جاوا: بیت و بایت - 8
همانطور که می بینید، ارقام را در هنگام جمع به همان روشی که در سیستم اعشاری وجود دارد، انتقال می دهیم. تجزیه و تحلیل جمع را می توان به عنوان مثال در اینجا مشاهده کرد: به هر حال، به طور دوره ای کلمه "تخلیه" ذکر می شود. و این چیه؟ مکان فقط یک "عنصر ساختاری" برای نمایش یک عدد است. یعنی عدد 10 از دو رقم تشکیل شده است: برای نوشتن این عدد به 2 رقم، 2 مکان، 2 عنصر نیاز داریم. درک این موضوع برای ما مهم است زیرا در سیستم اعداد باینری، یک رقم یک بیت است . کلمه بیت از کلمه انگلیسی "رقم دودویی" گرفته شده است ، یعنی یک عدد باینری. می تواند 0 یا 1 باشد. اما همانطور که ما اعداد و کلمات را به عنوان یک کل می خوانیم، نه حرف به حرف، کامپیوترها هم یک بیت را نمی خوانند. برای حداقل "قطعه" اطلاعات پردازش شده در RAM (به اصطلاح کوچکترین واحد آدرس پذیر اطلاعات)، دنباله ای از 8 بیت خوانده می شود . از آنجایی که تعداد آنها 8 عدد است، این یکی "هشت" نامیده می شود. و همچنین - کلمه شناخته شده تر Byte . برای یادآوری هشت پا، می توانید به یاد داشته باشید که کلمه اختاپوس (هشت پا) به انگلیسی به عنوان octopus ترجمه شده است. یعنی در اینجا دقیقاً همان "octo" در عنوان وجود دارد:
جاوا: بیت و بایت - 9
بیایید به این فکر کنیم که حداکثر عددی که می توانیم به عنوان 8 بیت نمایش دهیم چقدر است؟
جاوا: بیت و بایت - 10
و در اینجا این سوال مطرح می شود: اعداد منفی چطور؟ برای درک این موضوع، اجازه دهید در مورد نحوه نمایش بایت ها در جاوا صحبت کنیم
جاوا: بیت و بایت - 11

جاوا و بایت

چگونه می توانیم از اعداد منفی در جاوا استفاده کنیم؟ به سادگی انجام می شود. در جاوا، بایت ها امضا می شوند. سمت چپ ترین رقم/بیت (که «مهمترین بیت» نیز نامیده می شود) نوعی «نشانگر» ساخته شده است که به این سؤال پاسخ می دهد: «آیا این عدد منفی است؟» اگر پاسخ مثبت است، نشانگر دارای مقدار 1 است. در غیر این صورت، 0 است. بیایید به مثالی نگاه کنیم که چگونه عدد 5 را به عدد منفی 5 تبدیل کنیم:
جاوا: بیت و بایت - 12
بر اساس این تصویر، می توانید محدودیت هایی را که یک مقدار Byte در آن قرار دارد، درک کنید:
جاوا: بیت و بایت - 13
همچنین واضح است که:
  • اگر یک را به 127 اضافه کنیم، 128- می شود.
  • اگر از 128- یک کم کنیم عدد 127 بدست می آید.
بنابراین، بایت در جاوا می تواند مقداری از 128- تا 127 داشته باشد. همانطور که به یاد داریم، یک بایت یک اکتت است. و حداکثر رقم/مهمترین بیت دارای شماره سریال 7 است، زیرا ما از صفر می شماریم. در این حالت، به راحتی می توان به خاطر داشت که یک بایت برابر است با -2 به توان 7 (حد پایین) تا 2 به توان 7 منهای 1 (حد بالایی). کار با خود نوع داده ساده است. ما از کامپایلر آنلاین جاوا "repl.it" به عنوان "جعبه شنی" برای این مقاله استفاده می کنیم. https://repl.it/languages/java. به عنوان مثال، اجازه دهید کدی را اجرا کنیم که یک متغیر بایت را به شکل باینری به عنوان یک رشته نشان می دهد:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
کار با بایت ها به طور فعال هنگام کار با جریان های ورودی/خروجی استفاده می شود. می توانید در آموزش Oracle بیشتر بخوانید: " I/O Streams ". علاوه بر این، در جاوا می توانید از یک کلمه خاص برای تعیین مقدار به صورت بیت استفاده کنید:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
جاوا: بیت و بایت - 14

دستکاری بیت

با لمس بایت ها و بیت ها، نمی توان به دستکاری های مختلف بیت اشاره کرد. احتمالاً متداول‌ترین عملیات، شیفت (Bitwise shift یا bit-shift) است. و همه به این دلیل که نتیجه آنها دارای مزایای عملی واضح است. استفادش چی هست؟ جابجایی به سمت چپ توسط N موقعیت برابر است با ضرب عدد در 2N. و تغییر به راست مشابه همان تقسیم است.بنابراین، 5<<2 == 5*Math.pow(2,2) و برای درک اینکه چرا اینطور است، اجازه دهید به این مثال با جزئیات بیشتری نگاه کنیم:
جاوا: بیت و بایت - 15
نفی بیتی NOT (Unary bitwise)، که با یک tilde نشان داده می شود، بیت ها را معکوس می کند. به عنوان یک tilde نوشته می شود، برای مثال ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
این یک بار دیگر نشان می دهد که وقتی جاوا علامت یک عدد را تغییر می دهد، علاوه بر معکوس کردن مقادیر بیت در انتهای آن، +1 را انجام می دهیم. و بدون این، همانطور که می بینیم، عدد 5 ما تغییر می کند. و برای اینکه همان عدد قبل از تغییر علامت باقی بماند، باید 1+ را انجام دهید. Bitwise AND به شما اجازه می دهد تا دو عدد مختلف را با مقدار 1 برای بیت تنها در صورتی که همه بیت ها دارای مقدار یک باشند، باقی بگذارید. نکته جالب در مورد این ممکن است این باشد که برخی از مزایای کاربردی دارد:
int x=4;
System.out.println((x&1) != 1);
این کد عدد x را برای برابری بررسی می کند. بیایید به یک مثال نگاه کنیم:
جاوا: بیت و بایت - 16
با استفاده از Bitwise AND و Bitwise OR می توانید از ماسک ها استفاده کنید:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
برای جزئیات بیشتر به " گزینه های پوشش با عملگرهای بیتی در جاوا " مراجعه کنید. دستکاری بیت موضوع جالبی است که بررسی ها، مقالات و کتاب های جداگانه ای در مورد آن نوشته شده است. و از اینجا راه طولانی برای رمزنگاری آغاز می شود. به عنوان بخشی از این بررسی، ارزش درک این را دارد که چرا و چگونه کار می کند. برای کسب اطلاعات بیشتر در مورد عملیات بیت، خواندن بررسی از tproger را توصیه می کنم: " درباره عملیات بیت ".

انواع اولیه

بنابراین، یک بایت یک هشت بیت است، یعنی 8 بیت. به راحتی می توان به خاطر داشت که در جاوا 8 نوع اولیه نیز به طور تصادفی وجود دارد. یک نوع اولیه یک نوع داده است که در یک زبان برنامه نویسی ساخته شده است، یعنی به طور پیش فرض در دسترس است. بایت کوچکترین نوع داده اولیه از نظر ردپای حافظه است که جاوا می تواند با آن کار کند. همانطور که قبلاً گفتیم، یک بایت 8 بیت را اشغال می کند. بنابراین، مهم ترین رقم، عدد 7 است. بنابراین، بایت حاوی مقادیر از -2 تا توان 7 تا 2 تا توان 7 منهای 1 نتیجه است. چه انواع بدوی دیگری وجود دارد:
جاوا: بیت و بایت - 17
همانطور که از جدول می بینیم، انواع داده ها از نظر مقدار داده های اشغال شده دو برابر می شود. یعنی short = 2 * بایت و int = 2 * short. در واقع به خاطر سپردن آن آسان است. به یاد داشته باشید که بایت = 8 بیت است. این واقعیت که نمی تواند کمتر باشد نیز به یاد می آورد. در زبان انگلیسی به عدد صحیح عدد صحیح می گویند. نوع اولیه از آن را مخفف int نامیدند. یک عدد صحیح منظم وجود دارد - int. یک نسخه کوتاه، کوتاه، و یک نسخه طولانی، طولانی وجود دارد. بر این اساس، int 32 بیت (4 بایت) را اشغال می کند. نسخه کوتاه 2 برابر کوچکتر است - 16 بیت (2 بایت) و نسخه طولانی دو برابر بزرگتر است، یعنی. 64 بیت (8 بایت). بنابراین یک int حداکثر می تواند عددی در حدود 2 میلیارد و صد میلیون را ذخیره کند. و long می تواند حداکثر حدود 9 کوادریلیون (کلمه خوبی) را ذخیره کند. با یادآوری شوخی قدیمی در مورد اینکه چگونه یک برنامه نویس مبتدی فکر می کند که در یک کیلو بایت 1000 بایت وجود دارد و یک برنامه نویس کامل معتقد است که در هر کیلوگرم 1024 گرم است، می توانیم بفهمیم:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
به هر حال، یک خواننده با دقت ممکن است متوجه شده باشد که تنها 7 نوع در تصویر وجود دارد. نوع 8 ابتدایی بولی است. boolean یک نوع داده بولی است که تنها دو مقدار دارد: true و false. اما این سوال پیش می آید - اندازه آن چقدر است؟ مشخصات ماشین مجازی جاوا و بخش " 2.3.4. نوع بولی " به ما پاسخ می دهد:
جاوا: بیت و بایت - 18
یعنی فقط یک بولی همان مقدار int را می گیرد. اگر آرایه ای از بولی را اعلام کنیم، هر عنصر آرایه 1 بایت را اشغال می کند. اینها معجزه هایی هستند :)

نتیجه

من به شما پیشنهاد می کنم با چند ماده دیگر برای تثبیت آشنا شوید: #ویاچسلاو
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION