BIN_DEC_HEX(1) rrdtool BIN_DEC_HEX(1)

bin_dec_hex - نحوه استفاده از نمادگذاری دودویی، ده‌دهی و شانزده‌شانزدهی (هگزادسیمال)

بیشتر افراد از دستگاه اعداد ده‌دهی (decimal) استفاده می‌کنند. این دستگاه برای نمایش اعداد از ده نماد استفاده می‌کند. هنگامی که این ده نماد تمام می‌شوند، دوباره از ابتدا شروع کرده و موقعیت سمت چپ را یک واحد افزایش می‌دهند. رقم 0 تنها زمانی نشان داده می‌شود که یگانه نماد موجود در دنباله باشد، یا اینکه در ابتدای عدد قرار نگرفته باشد.

اگر این موضوع برایتان مبهم به نظر می‌رسد، این همان چیزی است که به صورت اعداد بیان می‌شود:

 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

و به همین ترتیب.

هر بار که رقم ۹ افزایش می‌یابد، به 0 بازنشانی شده و موقعیت قبلی (سمت چپ) یک واحد افزایش می‌یابد (از 0 به 1). بنابراین عدد ۹ را می‌توان به شکل "00009" دید و هنگامی که باید ۹ را افزایش دهیم، آن را به صفر بازنشانی کرده و رقم درست قبل از ۹ را افزایش می‌دهیم تا عدد به "00010" تبدیل شود. صفرهای سمت چپ را نمی‌نویسیم مگر اینکه تنها رقم موجود باشد (عدد 0). و البته، صفرهایی را که در هر جای دیگری در داخل یا انتهای عدد قرار بگیرند می‌نویسیم:

"00010" -> " 0010" -> " 010" -> "  10", but not "  1 ".

این موضوع بسیار پایه‌ای بود و شما از قبل آن را می‌دانستید. پس چرا آن را مطرح کردم؟ خب، رایانه‌ها معمولاً اعداد را با ۱۰ رقم مختلف نمایش نمی‌دهند. آن‌ها فقط از دو نماد مختلف یعنی "0" و "1" استفاده می‌کنند. همان قوانین را روی این مجموعه از ارقام اعمال کنید تا به دستگاه اعداد دودویی (binary) برسید:

   0
   1
  10
  11
 100
 101
 110
 111
1000
1001
1010
1011
1100
1101

و به همین ترتیب.

اگر تعداد ردیف‌ها را بشمارید، خواهید دید که این‌ها نیز دوباره ۱۴ عدد مختلف هستند. این اعداد همان اعداد هستند و معنای یکسانی با فهرست اول دارند، ما فقط از شیوه نمایش متفاوتی استفاده کردیم. این بدان معناست که شما باید شیوه نمایش استفاده‌شده، یا همان دستگاه اعداد یا مبنا (base) را بشناسید. به طور معمول، اگر دستگاه اعداد مورد استفاده را صریحاً مشخص نکنیم، به طور ضمنی از دستگاه ده‌دهی استفاده می‌کنیم. اگر بخواهیم از هر دستگاه عددنویسی دیگری استفاده کنیم، باید این موضوع را مشخص نماییم. روش‌های متداول معدودی برای انجام این کار وجود دارد. یک شکل رایج، نوشتن 1010(2) است که یعنی شما عددی را در نمایش دودویی آن نوشته‌اید. این همان عدد ده است. اگر 1010 را بدون مشخص کردن مبنا بنویسید، این عدد به عنوان هزار و ده در مبنای ۱۰ تفسیر می‌شود.

در کتاب‌ها، شکل دیگری رایج است. در آن روش از زیرنویس‌ها (نویسه‌های کوچک، کمابیش بین دو خط) استفاده می‌شود. در این حالت می‌توانید پرانتزها را حذف کرده و عدد را با نویسه‌های معمولی و به دنبال آن یک عدد دو کوچک درست در پشت آن بنویسید.

از آنجا که به دستگاه اعداد به کار رفته مبنا نیز گفته می‌شود، ما از عدد 1100 در مبنای ۲ یا عدد 12 در مبنای ۱۰ سخن می‌گوییم.

در دستگاه دودویی، نوشتن صفرهای سمت چپ (پیشرو) رایج است. بسته به زمینه کاربرد، اعداد در دسته‌های چهارتایی، هشت‌تایی یا شانزده‌تایی نوشته می‌شوند.

ما می‌توانیم هنگام گفتگو با رایانه‌ها (...برنامه‌نویسی...) از شکل دودویی استفاده کنیم، اما اعداد نمایش‌های بسیار طولانی خواهند داشت. عدد 65'535 (اغلب در سیستم ده‌دهی از ' برای خوانایی و جدا کردن دسته‌های سه‌رقمی استفاده می‌شود) به صورت 1111111111111111(2) نوشته می‌شود که ۱۶ بار تکرار رقم 1 است. این کار دشوار و خطاپذیر است. بنابراین، ما معمولاً از مبنای دیگری به نام شانزده‌شانزدهی (hexadecimal یا هگزادسیمال) استفاده می‌کنیم. این دستگاه از ۱۶ نماد مختلف استفاده می‌کند. ابتدا نمادهای سیستم ده‌دهی به کار می‌روند، سپس با حروف الفبا ادامه می‌دهیم. به این ترتیب 0، 1، 2، 3، 4، 5، 6، 7، 8، 9، A، B، C، D، E و F به دست می‌آیند. این سیستم انتخاب شده است زیرا شکل شانزده‌شانزدهی را می‌توان بسیار آسان به دستگاه دودویی تبدیل کرد (و برعکس).

دستگاه دیگری نیز مورد استفاده قرار می‌گیرد که دستگاه هشت‌هشتی (octal یا اکتال) نام دارد. این روش در گذشته رایج‌تر بود، اما امروزه دیگر چندان استفاده نمی‌شود. از آنجا که ممکن است گاهی با کاربرد آن روبرو شوید، بهتر است به آن عادت کنید و ما آن را در ادامه نشان می‌دهیم. داستان همانند سایر نمایش‌هاست، اما با هشت نماد متفاوت.

 Binary      (2)
 Octal       (8)
 Decimal     (10)
 Hexadecimal (16)
 (2)    (8) (10) (16)
 00000   0    0    0
 00001   1    1    1
 00010   2    2    2
 00011   3    3    3
 00100   4    4    4
 00101   5    5    5
 00110   6    6    6
 00111   7    7    7
 01000  10    8    8
 01001  11    9    9
 01010  12   10    A
 01011  13   11    B
 01100  14   12    C
 01101  15   13    D
 01110  16   14    E
 01111  17   15    F
 10000  20   16   10
 10001  21   17   11
 10010  22   18   12
 10011  23   19   13
 10100  24   20   14
 10101  25   21   15
اکثر رایانه‌های امروزی از بایت‌های هشت‌بیتی استفاده می‌کنند. این بدان معناست که آنها در هر لحظه هشت بیت را ذخیره می‌کنند. اکنون می‌توانید ببینید چرا مبنای هشت (octal) برای این کار چندان کاربردی نیست: برای نمایش هشت بیت به سه رقم نیاز خواهید داشت، و این یعنی مجبورید از یک رقم کامل فقط برای نمایش دو بیت استفاده کنید (2+3+3=8). این نوعی هدررفت است. برای ارقام شانزده‌شانزدهی (hexadecimal)، فقط به دو رقم نیاز دارید که هر دو به‌طور کامل استفاده می‌شوند:
(2)      (8)  (10) (16)
11111111 377  255   FF

می‌توانید ببینید چرا دودویی (binary) و شانزده‌شانزدهی (hexadecimal) را می‌توان به‌سرعت به یکدیگر تبدیل کرد: به ازای هر رقم شانزده‌شانزدهی، دقیقاً چهار رقم دودویی وجود دارد. یک عدد دودویی را در نظر بگیرید: چهار رقم از سمت راست جدا کنید و آن را به یک رقم شانزده‌شانزدهی تبدیل کنید (جدول بالا را ببینید). این کار را تا زمانی که رقمی باقی نماند تکرار کنید. عکس این کار نیز صادق است: یک عدد شانزده‌شانزدهی بردارید و برای هر رقم، معادل دودویی آن را بنویسید.

رایانه‌ها (یا بهتر بگوییم، تجزیه‌کننده‌هایی که روی آنها اجرا می‌شوند) در تبدیل عددی مانند 1234(16) با مشکل مواجه خواهند شد. بنابراین اعداد شانزده‌شانزدهی با یک پیشوند مشخص می‌شوند. این پیشوند به زبانی که در آن کد می‌نویسید بستگی دارد. برخی از این پیشوندها عبارتند از "0x" برای C، "$" برای Pascal و "#" برای HTML. معمولاً فرض بر این است که اگر عددی با صفر شروع شود، در مبنای هشت است. تا زمانی که بدانید چه چیزی استفاده شده، تفاوتی نمی‌کند چه باشد. در اینجا از "0x" برای شانزده‌شانزدهی، "%" برای دودویی و "0" برای مبنای هشت استفاده می‌شود. اعداد زیر همگی یکسان هستند، فقط نمایش (مبنای) آنها متفاوت است: 021 0x11 17 %00010001

برای انجام محاسبات و تبدیل‌ها باید یک مورد دیگر را نیز درک کنید؛ موضوعی که از پیش می‌دانید، اما شاید هنوز به چشم ندیده‌اید:

اگر عدد 1234 را بنویسید (بدون پیشوند، پس ده‌دهی یا decimal است)، منظور شما عدد هزار و دویست و سی و چهار است. به بیان فرمولی:

1 * 1000 = 1000
2 *  100 =  200
3 *   10 =   30
4 *    1 =    4

این را می‌توان به‌صورت زیر نیز نوشت:

1 * 10^3
2 * 10^2
3 * 10^1
4 * 10^0

که در آن ^ به معنای «به توانِ» است.

ما از مبنای 10 و موقعیت‌های 0، 1، 2 و 3 استفاده می‌کنیم. راست‌ترین موقعیت نباید در 10 ضرب شود. دومین موقعیت از سمت راست باید یک بار در 10 ضرب شود. سومین موقعیت از سمت راست، دو بار در 10 ضرب می‌شود. این روند برای هر تعداد موقعیت که استفاده شود ادامه می‌یابد.

در تمامی نمایش‌های دیگر نیز وضعیت به همین منوال است:

0x1234 برابر خواهد بود با:

1 * 16^3
2 * 16^2
3 * 16^1
4 * 16^0

01234 برابر خواهد بود با:

1 * 8^3
2 * 8^2
3 * 8^1
4 * 8^0

این مثال را نمی‌توان برای دودویی انجام داد زیرا آن دستگاه فقط از دو نماد استفاده می‌کند. مثالی دیگر:

%1010 برابر خواهد بود با:

1 * 2^3
0 * 2^2
1 * 2^1
0 * 2^0

تبدیل آن به شکل شانزده‌شانزدهی و ترجمهٔ مستقیم %1010 به 0xA بسیار ساده‌تر می‌بود. پس از مدتی به آن عادت خواهید کرد؛ دیگر نیازی به انجام هیچ محاسبه‌ای نخواهید داشت، بلکه صرفاً می‌دانید که 0xA به معنای 10 است.

برای تبدیل یک عدد ده‌دهی به شانزده‌شانزدهی می‌توانید از روش زیر استفاده کنید. تخمین زدن آن در ابتدا کمی زمان می‌برد، اما هر چه بیشتر از این سیستم استفاده کنید، آسان‌تر خواهد شد. پس از آن، به روش دیگری نیز نگاهی خواهیم انداخت.

ابتدا باید بدانید در دستگاه دیگر از چند موقعیت استفاده خواهد شد. برای این کار، باید بیشترین اعدادی را که به کار خواهید برد بدانید. خب، این کار به آن سختی که به نظر می‌رسد نیست. در مبنای ده‌دهی، بزرگ‌ترین عددی که می‌توانید با دو رقم بسازید "99" است. بیشترین برای سه رقم: "999". عدد بعدی به یک موقعیت اضافی نیاز خواهد داشت. این ایده را وارونه کنید و خواهید دید که عدد را می‌توان با کم کردن ۱ از 10^3 (10*10*10 برابر است با 1000) یا 10^2 منهای یک به دست آورد.

این کار برای شانزده‌شانزدهی نیز قابل انجام است:

16^4 = 0x10000 = 65536
16^3 =  0x1000 =  4096
16^2 =   0x100 =   256
16^1 =    0x10 =    16

اگر عددی کوچک‌تر از 65'536 باشد، در چهار موقعیت جای می‌گیرد. اگر عدد بزرگ‌تر از 4'095 باشد، باید از موقعیت ۴ استفاده کنید. تعداد دفعاتی که می‌توانید 4'096 را بدون منفی شدن از عدد کم کنید، اولین رقمی است که یادداشت می‌کنید. این مقدار همیشه عددی از ۱ تا ۱۵ (0x1 تا 0xF) خواهد بود. همین کار را برای سایر موقعیت‌ها انجام دهید.

بیایید با 41'029 امتحان کنیم. این عدد کوچک‌تر از 16^4 اما بزرگ‌تر از 16^3-1 است. این بدان معناست که باید از چهار موقعیت استفاده کنیم. می‌توانیم 16^3 را بدون منفی شدن، ده بار از 41'029 کم کنیم. بنابراین، چپ‌ترین رقم "A" خواهد بود، پس 0xA???? را داریم. عدد به 41'029 - 10*4'096 = 41'029-40'960 = 69 کاهش می‌یابد. عدد 69 کوچک‌تر از 16^3 است اما بزرگ‌تر از 16^2-1 نیست. بنابراین دومین رقم "0" است و اکنون 0xA0?? را داریم. عدد 69 کوچک‌تر از 16^2 و بزرگ‌تر از 16^1-1 است. می‌توانیم 16^1 (که همان ۱۶ معمولی است) را چهار بار کم کرده و رقم "4" را بنویسیم تا به 0xA04? برسیم. عدد 64 را از 69 کم کنید (69 - 4*16) و رقم آخر 5 خواهد بود --> 0xA045.

روش دیگر، عدد را از سمت راست می‌سازد. بیایید دوباره 41'029 را امتحان کنیم. آن را بر ۱۶ تقسیم کنید و از بخش‌های اعشاری صرف‌نظر کنید (فقط اعداد صحیح).

41'029 / 16 برابر است با 2'564 با باقی‌ماندهٔ 5. عدد 5 را بنویسید.
2'564 / 16 برابر است با 160 با باقی‌ماندهٔ 4. عدد 4 را قبل از 5 بنویسید.
160 / 16 برابر است با 10 بدون باقی‌مانده. در ابتدای 45 یک 0 بگذارید.
10 / 16 کمتر از یک است. اینجا پایان دهید و 0xA را در ابتدا بگذارید. نتیجه 0xA045 می‌شود.

اینکه از کدام روش استفاده کنید به خودتان بستگی دارد. از هر روشی که برایتان مناسب است استفاده کنید. من از هر دوی آنها استفاده می‌کنم بدون اینکه بتوانم بگویم در هر مورد از کدام روش استفاده کرده‌ام؛ فکر می‌کنم فقط به خود عدد بستگی دارد. واقعیت این است که برخی اعداد در طول برنامه‌نویسی زیاد تکرار خواهند شد. اگر عدد به عددی که با آن آشنایی دارم نزدیک باشد، از روش اول استفاده می‌کنم (مانند 32'770 که به 32'768 + 2 تجزیه می‌شود و می‌دانم که 0x8000 + 0x2 = 0x8002 است).

برای دودویی نیز می‌توان از همین رویکرد استفاده کرد. مبنا به جای ۱۶ برابر با ۲ است و تعداد موقعیت‌ها به‌سرعت رشد خواهد کرد. استفاده از روش دوم این مزیت را دارد که خیلی راحت می‌توانید ببینید آیا باید صفر بنویسید یا یک: اگر بر دو تقسیم کنید، در صورتی که عدد زوج باشد باقی‌مانده صفر و در صورتی که فرد باشد باقی‌مانده یک خواهد بود:

41029 / 2 = 20514 باقی‌مانده 1
20514 / 2 = 10257 باقی‌مانده 0
10257 / 2 =  5128 باقی‌مانده 1
 5128 / 2 =  2564 باقی‌مانده 0
 2564 / 2 =  1282 باقی‌مانده 0
 1282 / 2 =   641 باقی‌مانده 0
  641 / 2 =   320 باقی‌مانده 1
  320 / 2 =   160 باقی‌مانده 0
  160 / 2 =    80 باقی‌مانده 0
   80 / 2 =    40 باقی‌مانده 0
   40 / 2 =    20 باقی‌مانده 0
   20 / 2 =    10 باقی‌مانده 0
   10 / 2 =     5 باقی‌مانده 0
    5 / 2 =     2 باقی‌مانده 1
    2 / 2 =     1 باقی‌مانده 0
    1 / 2 زیر 0   باقی‌مانده 1

نتایج را از راست به چپ یادداشت کنید: %1010000001000101

دسته‌بندی در گروه‌های چهارتایی:.PP

%1010000001000101
%101000000100 0101
%10100000 0100 0101
%1010 0000 0100 0101

تبدیل به هگزادسیمال: 0xA045

عدد %1010000001000101 را سه‌رقم‌سه‌رقم دسته‌بندی کرده و به اکتال تبدیل کنید:

%1010000001000101
%1010000001000 101
%1010000001 000 101
%1010000 001 000 101
%1010 000 001 000 101
%1 010 000 001 000 101
%001 010 000 001 000 101
   1   2   0   1   0   5 --> 0120105
بنابراین: %1010000001000101 = 0120105 = 0xA045 = 41029
یا: 1010000001000101(2) = 120105(8) = A045(16) = 41029(10)
یا: 1010000001000101(2) = 120105(8) = A045(16) = 41029

در ابتدا هنگام جمع زدن اعداد، احتمالاً آن‌ها را به فرم ده‌دهی (دسیمال) تبدیل کرده و پس از انجام عمل جمع، دوباره به مبنای اصلی خود بازمی‌گردانید. اگر مکرراً از سایر سیستم‌های عددی استفاده کنید، خواهید دید که می‌توانید محاسبات را مستقیماً در همان مبنای مورد استفاده انجام دهید. در هر نمایشی شیوه کار یکسان است: اعداد ستون سمت راست را با هم جمع کنید، راست‌ترین رقم حاصل را بنویسید، رقم‌های دیگر (رقم نقلی) را به خاطر بسپارید و در مرحله بعدی به کار ببرید. همین کار را برای دومین رقم از سمت راست و به همین ترتیب ادامه دهید:

%1010 + %0111 --> 10 + 7 --> 17 --> %00010001

تبدیل خواهد شد به:

   %1010
   %0111 +
    ||||
    |||+-- جمع 0 + 1، حاصل 1 است، رقمی برای انتقال نیست
    ||+--- جمع 1 + 1، حاصل %10 است، 0 را بنویسید و 1 را به خاطر بسپارید
    |+---- جمع 0 + 1 + 1 (رقم نقلی)، حاصل = 0، نگه‌داشتن 1
    +----- جمع 1 + 0 + 1 (رقم نقلی)، حاصل = 0، نگه‌داشتن 1
           چیزی برای جمع نیست، 1 رقم نقلی، حاصل = 1
--------
  %10001 حاصل است، من ترجیح می‌دهم آن را به صورت %00010001 بنویسم

برای مقادیر کوچک، سعی کنید محاسبات را خودتان انجام دهید و سپس با یک ماشین‌حساب بررسی کنید. هرچه بیشتر محاسبات را خودتان انجام دهید، بیشتر متوجه خواهید شد که اشتباهی نکرده‌اید. در نهایت، محاسبات را در سایر مبناها نیز به همان راحتی مبنای ده‌دهی انجام خواهید داد.

وقتی اعداد بزرگ‌تر می‌شوند، باید توجه داشته باشید که کامپیوتر (رایانه) صرفاً برای داشتن یک نام زیبا کامپیوتر نامیده نشده است! ماشین‌حساب‌های بسیار و متنوعی در دسترس هستند، از آن‌ها استفاده کنید. برای یونیکس می‌توانید از "bc" که کوتاه‌شده‌ی Binary Calculator است استفاده کنید. این ابزار نه‌تنها در مبنای ده‌دهی، بلکه در تمام مبناهایی که ممکن است به آن‌ها نیاز پیدا کنید (از جمله باینری) محاسبه می‌کند.

برای کاربران ویندوز: ماشین‌حساب را باز کنید (start->programs->accessories->calculator) و در صورت نیاز روی view->scientific کلیک کنید. اکنون یک ماشین‌حساب علمی دارید و می‌توانید در مبناهای باینری یا هگزادسیمال محاسبه کنید.

امیدوارم از این مثال‌ها و توضیحات آن‌ها بهره برده باشید. اگر این‌طور است، هرگاه دیگران سؤالات پایه‌ای داشتند، با ارجاع دادنشان به این سند به آن‌ها کمک کنید. آن‌ها نه‌تنها پاسخ خود را خواهند یافت، بلکه هم‌زمان مطالب بسیار بیشتری را نیز فرا خواهند گرفت.

Alex van den Bogaerdt <alex@vandenbogaerdt.nl>

2026-08-08 1.11.0