بیت، بایت و اعداد باینری
کامپیوتر همهچیز را با صفر و یک نگه میدارد: بیت و بایت، شمارش در مبنای ۲ و ۱۶، تبدیل عدد بین مبناها با پایتون و bash، دیدن بایتهای واقعی یک متن با xxd، فرق KB با KiB و چرا دیسک ۱ ترابایتی ۹۳۱ گیگ نشان داده میشود، و فرق Mbps با MB/s.
- حدود ۲۲ دقیقه مطالعه
- ۷ مثال اجراشده
- ۳ تمرین با جواب
- مقدماتی (از صفر مطلق)
- بهروزرسانی: ۲۶ مهر ۱۴۰۵
توی این درس یاد میگیری کامپیوتر چطور با چیزی به سادهگی صفر و یک عکس، آهنگ و متن فارسی را نگه میدارد. بیت (bit) و بایت (byte) را میشناسی، شمارش در مبنای ۲ (باینری) و مبنای ۱۶ (هگز) را با دست و با کد انجام میدهی، بایتهای واقعی یک متن را میبینی، و جواب این معما را میگیری که چرا دیسک «۱ ترابایتی» که خریدی، در کامپیوتر «۹۳۱ گیگ» نشان داده میشود.
مسئله: کامپیوتر فقط کلید روشن و خاموش دارد
Section titled “مسئله: کامپیوتر فقط کلید روشن و خاموش دارد”داخل کامپیوتر میلیاردها کلید ریز الکتریکی هست که هر کدام فقط دو حالت دارند: روشن یا خاموش (جریان هست یا نیست). هیچ جای کامپیوتر «حرف الف» یا «رنگ آبی» یا «آهنگ» وجود ندارد. پس چطور عکس و فیلم و متن را نگه میدارد؟ جواب: همهچیز را به عدد تبدیل میکند، و عدد را با همان کلیدهای روشن و خاموش مینویسد.
تشبیه: ردیف کلید برق
Section titled “تشبیه: ردیف کلید برق”یک ردیف کلید برق را تصور کن که هر کدام فقط خاموش (۰) یا روشن (۱) است.
- با ۱ کلید دو حالت داری: ۰ یا ۱.
- با ۲ کلید چهار حالت: ۰۰، ۰۱، ۱۰، ۱۱.
- با ۳ کلید هشت حالت، با ۴ کلید شانزده حالت. هر کلید تازه، تعداد حالتها را دو برابر میکند.
حالا قرار میگذاریم هر حالت یک معنی داشته باشد: حالت اول یعنی «۰»، دوم «۱»، سوم «۲»… با ۸ کلید ۲۵۶ حالت داری، یعنی میتوانی از ۰ تا ۲۵۵ را بنویسی. اگر قرار بگذاریم عددی مثل ۶۵ یعنی حرف «A»، حالا یک ردیف کلید میتواند یک حرف را نگه دارد. همین کار را برای رنگ، صدا و هر چیز دیگر میکنند.
بیت و بایت
Section titled “بیت و بایت”- بیت (bit) کوچکترین واحد: یک کلید، یک رقم صفر یا یک.
- بایت (byte) = ۸ بیت. یک بایت ۲۵۶ حالت دارد (۰ تا ۲۵۵). تقریباً اندازهی «یک حرف انگلیسی».
- بقیه واحدها از بایت میآیند.
شمارش در مبنای ۲
Section titled “شمارش در مبنای ۲”ما در زندگی در مبنای ۱۰ میشماریم: ده رقم (۰ تا ۹)، و هر رقم جایگاهی دارد: در ۲۰۲۶، رقم ۲ سمت چپ یعنی «دو هزارتا»، رقم بعدی «بیستتا» و… چون هر جایگاه ۱۰ برابر قبلی است.
در مبنای ۲ (باینری) فقط دو رقم داریم (۰ و ۱) و هر جایگاه ۲ برابر قبلی است: ۱، ۲، ۴، ۸، ۱۶، ۳۲، ۶۴، ۱۲۸. عدد باینری 1101 یعنی: یک هشت، یک چهار، صفر دو، یک یک: ۸ + ۴ + ۰ + ۱ = ۱۳.
| جایگاه | ۱۲۸ | ۶۴ | ۳۲ | ۱۶ | ۸ | ۴ | ۲ | ۱ |
|---|---|---|---|---|---|---|---|---|
| مثال: عدد ۱۳ | ۰ | ۰ | ۰ | ۰ | ۱ | ۱ | ۰ | ۱ |
| مثال: عدد ۶۵ (حرف A) | ۰ | ۱ | ۰ | ۰ | ۰ | ۰ | ۰ | ۱ |
مثالهای عملی
Section titled “مثالهای عملی”دستورها روی یک کامپیوتر لینوکسی آزمایشی اجرا شدهاند. اگر پایتون روی سیستمت هست (ویندوز و مک هم میتوانند)، همان خطهای python3 -c را اجرا کن.
مثال ۱: شمردن با صفر و یک
Section titled “مثال ۱: شمردن با صفر و یک”پایتون هر عدد را به باینری تبدیل میکند. format(n, "04b") یعنی «عدد را در مبنای ۲ بنویس و با صفر پر کن تا چهار رقم شود»:
python3 -c "for n in range(0, 9): print(n, format(n, '04b'))"0 00001 00012 00103 00114 01005 01016 01107 01118 1000ستون اول عدد معمولی است و ستون دوم همان عدد با چهار کلید. به الگو نگاه کن: ستون راست هر بار ۰، ۱، ۰، ۱ میشود (مثل کلیدی که مدام عوض میشود)؛ ستون بعدی هر دو ردیف یک بار عوض میشود. وقتی چهار رقم پر میشود (۱۵ = 1111)، برای عدد بعد (۱۶) یک رقم تازه لازم است، درست مثل اینکه در دهدهی بعد از ۹۹ سه رقم لازم داری.
مثال ۲: یک عدد، سه مبنا
Section titled “مثال ۲: یک عدد، سه مبنا”عدد ۲۰۲۶ را در مبنای ۲، ۸ و ۱۶ مینویسیم. مبنای ۱۶ (هگزادسیمال، hex) شانزده رقم دارد: ۰ تا ۹ و بعد a تا f (یعنی ۱۰ تا ۱۵). برنامهنویسها دوستش دارند چون هر رقم هگز دقیقاً ۴ بیت است: یک بایت = دو رقم هگز.
python3 -c "n = 2026print('binary :', bin(n))print('octal :', oct(n))print('hex :', hex(n))"printf '%d in hex is %x\n' 2026 2026binary : 0b11111101010octal : 0o3752hex : 0x7ea2026 in hex is 7ea۲۰۲۶ در باینری 11111101010 (یازده رقم) است، در هگز 7ea (سه رقم) و در مبنای ۸ 3752. پیشوندها (0b برای باینری، 0o برای مبنای ۸ و 0x برای هگز) فقط به خواننده میگویند «این عدد در کدام مبنا نوشته شده». دستور printf در bash هم همین را میکند: %d عدد دهدهی، %x هگز. هگز سه رقم است در برابر یازده رقم باینری؛ برای همین برنامهنویسها هگز را ترجیح میدهند.
مثال ۳: برگشت از باینری به دهدهی
Section titled “مثال ۳: برگشت از باینری به دهدهی”برعکس هم ممکن است. در پایتون int("متن", مبنا) و در bash عبارت $((مبنا#عدد)):
python3 -c "print(int('11111101010', 2), int('7ea', 16))"echo $((2#11111101010)) $((16#7ea)) $((2#101))2026 20262026 2026 5هر دو تبدیل ما را به ۲۰۲۶ برگرداند، پس باینری و هگز همان عدد هستند، فقط به شکل دیگری نوشته شدهاند. در bash، $((2#101)) یعنی «عدد 101 را در مبنای ۲ بخوان» و جواب ۵ است.
مثال ۴: یک بایت چقدر جا دارد؟
Section titled “مثال ۴: یک بایت چقدر جا دارد؟”یک بایت هشت بیت است. بزرگترین عددی که در آن جا میشود، وقتی همهی هشت بیت یک باشند:
python3 -c "print('largest value in 8 bits :', int('11111111', 2), '(', format(255, '08b'), ')')for bits in (8, 16, 32, 64): print(f'{bits:>2} bits -> {2 ** bits:,} different values')"largest value in 8 bits : 255 ( 11111111 ) 8 bits -> 256 different values16 bits -> 65,536 different values32 bits -> 4,294,967,296 different values64 bits -> 18,446,744,073,709,551,616 different values- بزرگترین عدد در یک بایت ۲۵۵ است (
11111111، هشت تا یک). - با هر بیت اضافه، تعداد حالتها دو برابر میشود: ۸ بیت ۲۵۶ حالت، ۱۶ بیت ۶۵٬۵۳۶، ۳۲ بیت حدود ۴٫۳ میلیارد (تعداد آدرسهای IPv4 دنیا!)، و ۶۴ بیت عددی با ۲۰ رقم. وقتی میشنوی «پردازندهی ۶۴ بیتی»، یعنی پردازنده میتواند عددهای ۶۴ بیتی را یکجا پردازش کند (در تئوری تا حدود ۱۸ کوینتیلیون آدرس حافظه؛ پردازندههای واقعی از همهی بیتها استفاده نمیکنند: در مثال درس قبل
lscpuبرای آدرس فیزیکی «۵۲ بیت» گفت).
مثال ۵: بایتهای واقعی یک متن
Section titled “مثال ۵: بایتهای واقعی یک متن”حالا ببینیم دو حرف Hi در کامپیوتر چطور ذخیره میشوند. xxd (hex dump) بایتهای ورودی را نشان میدهد؛ با -b بهصورت باینری و بدون آن بهصورت هگز:
printf 'Hi' | xxd -bprintf 'Hi' | xxd00000000: 01001000 01101001 Hi00000000: 4869 Hiدو حرف، دو بایت، چهار رقم هگز:
- حرف
Hبرابر بایت01001000(هگز48، دهدهی ۷۲) و حرفiبرابر01101001(هگز69، دهدهی ۱۰۵) است. - این قرارداد که «کدام عدد کدام حرف است» کدگذاری (encoding) نام دارد. اینجا ASCII/UTF-8 است. در درس بعد میبینی فارسی چطور کدگذاری میشود.
- ستون کناری (
Hi) نمایش متنی بایتهاست.
مثال ۶: معمای ۱ ترابایت و ۹۳۱ گیگ
Section titled “مثال ۶: معمای ۱ ترابایت و ۹۳۱ گیگ”دو سیستم واحد وجود دارد. SI (دهدهی): کیلو = ۱۰۰۰، مگا = ۱۰۰۰ کیلو. فروشندهها از این استفاده میکنند. IEC (دودویی): کیبی (KiB) = ۱۰۲۴ بایت، مبی (MiB) = ۱۰۲۴ کیبی، گیبی (GiB)، تبی (TiB). سیستمعاملها معمولاً این را (با اسم «GB» اشتباهی) نشان میدهند. ابزار numfmt تبدیل میکند:
echo "SI : 1 MB = $(numfmt --to=none 1000000) bytes -> $(numfmt --to=si 1000000)"echo "IEC : 1 MiB = $(numfmt --from=iec-i 1Mi) bytes -> $(numfmt --to=iec-i 1048576)"python3 -c "tb = 10 ** 12 # '1 TB' on the boxprint(f'1 TB (box) = {tb:,} bytes = {tb / 2**30:.1f} GiB (shown as ~931 GB by Windows)')"SI : 1 MB = 1000000 bytes -> 1.0MIEC : 1 MiB = 1048576 bytes -> 1.0Mi1 TB (box) = 1,000,000,000,000 bytes = 931.3 GiB (shown as ~931 GB by Windows)- در SI، یک مگابایت ۱٬۰۰۰٬۰۰۰ بایت است (
1.0M)؛ در IEC، یک مبیبایت (MiB) ۱٬۰۴۸٬۵۷۶ بایت است (1.0Mi). حرفiدر آخر یعنی «دودویی». - یک «ترابایت» روی جعبه ۱۰¹۲ بایت است. وقتی ویندوز آن را بر ۲³⁰ (یک گیبیبایت) تقسیم کند، میشود ۹۳۱٫۳ و آن را «۹۳۱ GB» مینویسد. ظرفیت دیسک کم نشده؛ واحد عوض شده. (macOS برخلاف ویندوز برای «GB» از ۱۰۰۰ استفاده میکند، پس همان دیسک روی مک حدود ۱ ترابایت نشان داده میشود.)
مثال ۷: عددهایی که هر روز میبینی
Section titled “مثال ۷: عددهایی که هر روز میبینی”دو چیز آشنا که پشت پرده فقط بایتاند. رنگ: رنگ #1E90FF سه بایت است (قرمز، سبز، آبی) که در هگز نوشته شده. آدرس IP: 192.168.1.10 چهار بایت است که با نقطه از هم جدا شدهاند، یعنی یک عدد ۳۲ بیتی:
python3 -c "import ipaddresscolor = '1E90FF'print('color #' + color, '= red, green, blue =', [int(color[i:i+2], 16) for i in (0, 2, 4)])ip = ipaddress.ip_address('192.168.1.10')print('IP 192.168.1.10 as one 32-bit number:', int(ip))print('as bits:', format(int(ip), '032b'))"color #1E90FF = red, green, blue = [30, 144, 255]IP 192.168.1.10 as one 32-bit number: 3232235786as bits: 11000000101010000000000100001010- رنگ
#1E90FF: سه بایت1E،90،FF، یعنی قرمز ۳۰، سبز ۱۴۴ و آبی ۲۵۵ (بیشتر آبی). هر عدد بین ۰ و ۲۵۵ است، یعنی یک بایت. اینکه ۱۶ میلیون رنگ (۲۵۶ × ۲۵۶ × ۲۵۶) داریم از همینجاست. - آدرس
192.168.1.10چهار عدد بین ۰ و ۲۵۵ است، یعنی ۳۲ بیت؛ میشود یک عدد به بزرگی ۳٬۲۳۲٬۲۳۵٬۷۸۶. شبکهها در واقع با همین عدد کار میکنند و نقطهها فقط برای خواندن راحت آدمی است. در درس «شبکه و آدرس IP» ادامهاش میدهیم.
پشت پرده: چرا همیشه ۸ بیت و چرا هگز؟
Section titled “پشت پرده: چرا همیشه ۸ بیت و چرا هگز؟”چرا بایت ۸ بیت است؟ تصمیمی تاریخی است (دههی ۱۹۶۰)، ولی ۲۵۶ حالت برای نشان دادن یک حرف انگلیسی، رقم و علامتها مناسب بود و ۸ توان ۲ است که با طراحی مدارها جور درمیآید. امروز «بایت» یعنی ۸ بیت در همهجا.
چرا هگز؟ خواندن 11111101010 برای آدم سخت است و اشتباهکردنش آسان. چون ۴ بیت = ۱ رقم هگز، میتوانی هر چهار بیت را یکجا بخوانی: 0111 1110 1010 ← 7 e a ← 7ea. و یک بایت همیشه دقیقاً دو رقم هگز است (48 69 برای Hi). برای همین رنگها، آدرس MAC و خروجی xxd هگز است.
اعداد منفی چه؟ کامپیوتر علامت منفی ندارد؛ از ترفندی به اسم «مکمل دو» استفاده میکند: در ۸ بیت، 11111111 را میتوان ۲۵۵ خواند یا ۱-، بسته به اینکه برنامه بگوید عدد علامتدار است یا بیعلامت. اگر عددی از ظرفیتش بیشتر شود (۲۵۵ + ۱ در یک بایت) سرریز (overflow) میکند و به صفر برمیگردد. در درسهای بعد میبینی چرا برنامهنویسها به نوع و اندازهی عدد حساساند:
python3 -c "print('255 + 1 in one byte :', (255 + 1) % 256)print('-1 as 8 bits (unsigned) :', format(-1 & 0xFF, '08b'), '=', -1 & 0xFF)"255 + 1 in one byte : 0-1 as 8 bits (unsigned) : 11111111 = 255۲۵۵ + ۱ در یک بایت 0 شد (مثل کیلومترشمار)، و -1 در هشت بیت همان 11111111 است که اگر بیعلامت بخوانی ۲۵۵ میشود. نتیجهی عملی: هر عددی که برنامه نگه میدارد یک نوع و یک اندازه دارد و اگر از آن بزرگتر شود، خراب میشود.
جدول مرجع: واحدها
Section titled “جدول مرجع: واحدها”| اسم | علامت | اندازه | نوع |
|---|---|---|---|
| بیت | b |
۱ رقم صفر یا یک | — |
| بایت | B |
۸ بیت | — |
| کیلوبایت | KB | ۱٬۰۰۰ بایت | SI (فروشندهها) |
| کیبیبایت | KiB | ۱٬۰۲۴ بایت | IEC (سیستمعامل) |
| مگابایت | MB | ۱٬۰۰۰٬۰۰۰ بایت | SI |
| مبیبایت | MiB | ۱٬۰۴۸٬۵۷۶ بایت | IEC |
| گیگابایت | GB | ۱۰⁹ بایت | SI |
| گیبیبایت | GiB | ۲³⁰ بایت (حدود ۱٫۰۷۴ برابر GB) | IEC |
| ترابایت | TB | ۱۰¹² بایت | SI |
| تبیبایت | TiB | ۲⁴⁰ بایت (حدود ۱٫۱ برابر TB) | IEC |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) قاطی کردن بیت و بایت (b و B)
Section titled “۱) قاطی کردن بیت و بایت (b و B)”اینترنت را با بیت در ثانیه میفروشند (Mbps یا Mb/s) ولی فایل را با بایت نشان میدهند. اینترنت «۱۰۰ مگابیت» یعنی حداکثر ۱۲٫۵ مگابایت در ثانیه، نه ۱۰۰:
python3 -c "mbps = 100print(f'{mbps} Mbps = {mbps / 8} MB/s')size_mb = 500print(f'a {size_mb} MB file needs at least {size_mb / (mbps / 8):.0f} seconds')"100 Mbps = 12.5 MB/sa 500 MB file needs at least 40 seconds۱۰۰ مگابیت در ثانیه یعنی ۱۲٫۵ مگابایت در ثانیه؛ پس فایل ۵۰۰ مگابایتی حتی در بهترین حالت حداقل ۴۰ ثانیه طول میکشد، نه ۵ ثانیه. راهحل: همیشه به حرف کوچک و بزرگ نگاه کن: b کوچک بیت، B بزرگ بایت. برای تبدیل مگابیت به مگابایت تقسیم بر ۸.
۲) فراموش کردن مبنا
Section titled “۲) فراموش کردن مبنا”عدد 10 چند است؟ بستگی دارد: در مبنای ۱۰ ده، در مبنای ۲ دو، در مبنای ۱۶ شانزده. همیشه مبنا را بنویس (0b10، 0x10):
python3 -c "print(int('10', 10), int('10', 2), int('10', 16))"10 2 16همان نوشتهی 10 سه عدد متفاوت شد: ۱۰ و ۲ و ۱۶. راهحل: مبنا را صریح بنویس (پیشوند 0b، 0x یا توضیح) و هرگز عدد بدون مبنا را به کسی ندهد.
۳) رقمی که در آن مبنا وجود ندارد
Section titled “۳) رقمی که در آن مبنا وجود ندارد”python3 -c "print(int('12', 2))" 2>&1 | tail -n 1echo $((2#12))ValueError: invalid literal for int() with base 2: '12'bash: 2#12: value too great for base (error token is "2#12")رقم 2 در مبنای ۲ وجود ندارد (فقط ۰ و ۱). پایتون با ValueError و bash با «value too great for base» همین را میگویند. راهحل: رقمها باید از مبنا کوچکتر باشند: در مبنای ۲ فقط ۰ و ۱، در مبنای ۱۶ تا f.
عدد ۲۰۲۶ را به باینری و هگز ببر، و با تبدیل برعکس ثابت کن درست است.
دیدن جواب
python3 -c "n = 2026b, h = bin(n)[2:], hex(n)[2:]print(n, '->', b, '->', int(b, 2))print(n, '->', h, '->', int(h, 16))assert int(b, 2) == n and int(h, 16) == nprint('both round trips are correct')"2026 -> 11111101010 -> 20262026 -> 7ea -> 2026both round trips are correctدر هر دو جهت به ۲۰۲۶ رسیدیم و assert (که اگر شرط غلط باشد برنامه را با خطا قطع میکند) ساکت ماند و پیام آخر چاپ شد. bin(n)[2:] یعنی «رشتهی باینری را بگیر و دو حرف اول (0b) را دور بریز».
فایلی ۲ گیگابایتی (به معنی ۲ × ۱۰⁹ بایت) را با اینترنت ۱۰۰ مگابیت در ثانیه حداقل در چند ثانیه (و چند دقیقه) دانلود میکنی؟ و اگر اینترنت ۱ گیگابیت باشد؟
دیدن جواب
python3 -c "size_bits = 2 * 10**9 * 8for name, bps in (('100 Mbps', 100 * 10**6), ('1 Gbps', 10**9)): s = size_bits / bps print(f'{name:>8}: {s:5.0f} s = {s / 60:.1f} min')"100 Mbps: 160 s = 2.7 min 1 Gbps: 16 s = 0.3 min۲ گیگابایت = ۲ × ۱۰⁹ بایت = ۱۶ × ۱۰⁹ بیت. با ۱۰۰ مگابیت در ثانیه (۱۰⁸ بیت در ثانیه) میشود ۱۶۰ ثانیه، یعنی حدود ۲٫۷ دقیقه؛ با ۱ گیگابیت در ثانیه، ۱۶ ثانیه. نکته: اول همهچیز را به بیت برگرداندیم تا واحدها یکی شود. (عدد واقعی کمی بیشتر میشود، چون بخشی از پهنای باند صرف هدرهای شبکه میشود.)
تمرین اصلی درس: برنامهای بنویس که یک عدد بگیرد و جدول «دهدهی، باینری، هگز» را چاپ کند؛ و برای همهی عددهای ۰ تا ۱۰۰۰ ثابت کند تبدیل رفت و برگشت هیچوقت خراب نمیشود.
دیدن جواب
# prints a decimal / binary / hex table and checks round trips for 0..1000import sys
def row(n): return f"{n:>6} {n:>12b} {n:>5x}"
numbers = [int(a) for a in sys.argv[1:]] or [13, 65, 255, 2026]print(f"{'dec':>6} {'bin':>12} {'hex':>5}")for n in numbers: print(row(n))
for n in range(1001): assert int(format(n, "b"), 2) == n assert int(format(n, "x"), 16) == nprint("all 1001 round trips are correct")python3 convert.pypython3 convert.py 7 1024rm -f convert.py dec bin hex 13 1101 d 65 1000001 41 255 11111111 ff 2026 11111101010 7eaall 1001 round trips are correct dec bin hex 7 111 7 1024 10000000000 400all 1001 round trips are correctاسکریپت دو کار کرد: جدول سه ستونه را چاپ کرد (:>12b یعنی «باینری، راستچین، در ۱۲ ستون» و x هگز) و برای هر عدد ۰ تا ۱۰۰۰ دو بار assert زد. بدون آرگومان، چهار عدد پیشفرض را نشان داد؛ با آرگومان (7 1024)، همانها را. آخر بلوک فایل را پاک کردیم.
آزمونک
Section titled “آزمونک”یک بایت چند حالت مختلف میتواند داشته باشد؟
جواب درست: ۲۵۶
یک بایت هشت بیت است و هر بیت دو حالت دارد؛ پس ۲ × ۲ × ... (هشت بار) = ۲ به توان ۸ = ۲۵۶ حالت (از ۰ تا ۲۵۵). عدد ۸ تعداد بیتهاست، نه تعداد حالتها.
عدد باینری
1010در مبنای ۱۰ چند است؟جواب درست: ۱۰
از راست جایگاهها ۱، ۲، ۴، ۸ هستند. رقمها از چپ ۱ ۰ ۱ ۰اند، پس ۸ + ۰ + ۲ + ۰ = ۱۰. فقط جایگاههایی که رقمشان ۱ است جمع میشوند.
- ۸ ← ۸ فقط جایگاه اول (چپترین یک) است؛ جایگاه ۲ (رقم سوم) هم یک است و جمع نشده.
- ۱۲ ← برای ۱۲ باید جایگاههای ۸ و ۴ یک باشند (
1100). - ۲۰ ← عدد ۲۰ در باینری
10100است و پنج رقم دارد.
اینترنت «۸۰ مگابیت در ثانیه» دارم. حداکثر سرعت دانلود فایل چند مگابایت در ثانیه است؟
جواب درست: ۱۰
هر بایت ۸ بیت است، پس برای تبدیل مگابیت به مگابایت باید تقسیم بر ۸ کنی: ۸۰ ÷ ۸ = ۱۰ مگابایت در ثانیه. (در عمل کمی کمتر میشود.)
- ۸۰ ← ۸۰ واحدش مگابیت است؛ برنامهها سرعت را با مگابایت نشان میدهند و باید تقسیم بر ۸ شود.
- ۶۴۰ ← ضرب در ۸ جهت اشتباه است؛ از بیت به بایت باید تقسیم کرد.
- ۸ ← ۸ تعداد بیت یک بایت است، نه سرعت.
چرا دیسک «۱ ترابایتی» که خریدهای در ویندوز حدود ۹۳۱ گیگ نشان داده میشود؟
جواب درست: فروشنده با ۱۰۰۰ و ویندوز با ۱۰۲۴ حساب میکند (TB در برابر TiB)
فروشنده ۱ ترابایت را ۱۰¹۲ بایت حساب میکند. ویندوز با ضریب ۱۰۲۴ حساب میکند: ۱۰¹۲ ÷ ۲³⁰ ≈ ۹۳۱ (که آن را اشتباهاً GB مینویسد، در حالی که GiB است). ظرفیت در واقع یکی است، فقط واحد فرق دارد.
- فروشنده کم گذاشته است ← ظرفیت درست است؛ هر دو یک تعداد بایت را میشمارند.
- بخشی از دیسک همیشه خراب است ← دیسک نو خراب نیست و ظرفیت واقعی همان ۱۰¹۲ بایت است.
- ویندوز ۹۳۱ گیگ را برای خودش برمیدارد ← ویندوز چنین سهمی برنمیدارد؛ فقط واحد را به شکل دیگری نشان میدهد.
رنگ
#FF0000چند بایت است و چه رنگی است؟جواب درست: سه بایت، قرمز (R=255، G=0، B=0)
هر دو رقم هگز یک بایت است:
FF(۲۵۵) و00و00؛ سه بایت برای قرمز، سبز و آبی. قرمز کامل و بدون سبز و آبی، یعنی رنگ قرمز.- یک بایت، قرمز ← شش رقم هگز سه بایت میشود، نه یک بایت.
- سه بایت، سبز ← بایت اول قرمز است نه سبز؛ سبز کامل
#00FF00است. - شش بایت، قرمز ← شش رقم هگز است، نه شش بایت؛ هر دو رقم یک بایت.
در یک بایت (بدون علامت)، اگر به ۲۵۵ یک واحد اضافه کنی چه میشود؟
جواب درست: سرریز میکند و به ۰ برمیگردد
یک بایت فقط ۲۵۶ حالت دارد (۰ تا ۲۵۵) و ۲۵۶ در آن جا نمیشود. مثل کیلومترشمار قدیمی ماشین که بعد از ۹۹۹۹۹ دوباره به ۰۰۰۰۰ برمیگردد. به این «سرریز» میگویند و منبع باگهای معروف است.
- ۲۵۶ ← عدد ۲۵۶ نه بیت دارد و در یک بایت جا نمیشود.
- خطا میدهد و کامپیوتر خاموش میشود ← کامپیوتر خاموش نمیشود؛ مدار فقط رقم اضافه را دور میریزد.
- ۱۲۸ ← ۱۲۸ ربطی به این جمع ندارد.
جمعبندی
Section titled “جمعبندی”- کامپیوتر فقط صفر و یک میشناسد. بیت یک رقم است، بایت هشت بیت و ۲۵۶ حالت (۰ تا ۲۵۵).
- در مبنای ۲ هر جایگاه دو برابر قبلی است (۱، ۲، ۴، ۸…)؛ عدد را با جمع جایگاههای «یک» میخوانی.
- هگز شانزده رقم دارد (
0-9a-f) و هر رقمش ۴ بیت است؛ یک بایت دو رقم هگز. - رنگ و آدرس IP هم فقط چند بایتاند:
#1E90FFسه بایت،192.168.1.10چهار بایت. - فروشندهها ۱۰۰۰ (KB، MB، GB، TB) میشمارند، سیستمعاملها ۱۰۲۴ (KiB، MiB، GiB، TiB)؛ برای همین ۱ ترابایت میشود حدود ۹۳۱ گیگ.
- بیت (
b) و بایت (B) فرق دارند: اینترنت ۱۰۰ مگابیت یعنی ۱۲٫۵ مگابایت در ثانیه.
| دستور | کاری که میکند |
|---|---|
python3 -c "print(bin(13), hex(255))" | عدد به باینری و هگز |
python3 -c "print(int('1101', 2))" | باینری به دهدهی |
echo $((2#1101)) | باینری به دهدهی در bash |
printf '%x\n' 255 | دهدهی به هگز در bash |
printf 'Hi' | xxd -b | بایتهای یک متن، باینری |
printf 'Hi' | xxd | بایتهای یک متن، هگز |
numfmt --to=iec-i 1048576 | بایت به واحد IEC (۱٫۰Mi) |
numfmt --to=si 1000000 | بایت به واحد SI (۱٫۰M) |