Системы счисления
Система счисления - это совокупность приемов представления обозначения натуральных чисел. Этих "совокупностей приемов представления" существует очень много, но самая совершенная из всех - та, которая подчиняется позиционному принципу. А согласно этому принципу один и тот же цифровой знак имеет различные значения в зависимости от того места, где он расположен. Такая система счисления основывается на том, что некоторое число n единиц объединяются в единицу второго разряда, n единиц второго разряда объединяются в единицу третьего разряда и т. д. "Разрядам" нас учили еще в начальных классах школы. Например, у числа 35672 цифра "2" имеет первый разряд, "7" - второй, "6" - третий, "5" - четвертый и "3" - пятый. А "различные значения" цифрового знака "в зависимости от того места, где он расположен" и "объединение в единицу старшего разряда" на тех же уроках арифметики "объяснялось" следующим образом:
35672 = 30000 + 5000 + 600 + 70 + 2
35672 = 3*10000 + 5*1000 + 6*100 + 7*10 + 2*1
35672 = 3*104 + 5*103 + 6*102 + 7*101 + 2*100
Пальцев на руках у человека 10, поэтому и считать мы привыкли в системе счисления с основанием 10, то есть в десятичной. Для обозначения десятичных чисел мы используем цифры от 0 до 9, для обозначения чисел в системах счисления с основанием менее 10 мы используем те же цифры:
radix 8 - 0, 1, 2, 3, 4, 5, 6, 7;
radix 2 - 0, 1 и т. д.
Если же основание системы счисления больше десяти, то есть больше, чем десять привычных нам чисел, то начинают использоваться буквы английского алфавита. Например, для обозначения чисел в системе счисления с основанием 16 "как цифры" будут использоваться буквы А, B, C, D, E, F:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Работать мы будем только с тремя системами счисления: 10 (ну естественно), 16 и 2. Правда, в Си ещё восьмеричная система счисления используется, но нахрена не знаю. Числа в любой системе счисления строятся аналогично десятичной. Например, когда мы пишем десятичное число 123, то имеем в виду следующее:
1 раз 100 (10 раз по 10)
+ 2 раза 10
+ 3 раза 1
Если же мы используем символы 123 для предоставления, например, шестнадцатеричного числа, то подразумеваем следующее:
1 раз 256 (16 раз по 16)
+ 2 раза 16
+ 3 раза 1
Трудность у вас может возникнуть при использовании символов A, B, C и т. д. Чтобы решить эту проблему раз и навсегда, необходимо назубок вызубрить ма-а-аленькую табличку "соответствия" между употребляемыми в "компьютерном деле" систем счисления:
Основание |
Циферьки |
|||||||||||||||
10 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
2 | 0 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Следуя этой таблице, число 5BC в шестнадцатеричном формате "строится" так:
5 раз 256 (16 раз по 16)
+ 11 раз 16 (10 - потому что по таблице B как бы равно 11)
+ 12 раз 1
А теперь, если пораскинуть мозгами, с легкостью переведем 5BC из шестнадцатеричной в десятичную систему счисления:
5*256 + 11*16 + 12 = 1468
Еще немного про перевод между системами счисления. Например, преобразование числа 42936 из десятичного в шестнадцатеричный формат проводится следующим образом (в скобках - остаток):
42936/16 = 2683(8) 8 - младшая цифра
2683/16 = 167(11) B
167/16 = 10(7) 7
10/16 = 0(10) A - старшая цифра
----------------------------------------
42936=-0xA7B8
А вот и обратный процесс - перевод из шестнадцатеричного в десятичный числа 0xA7B8:
10*16=160 160+7=167 (10 - потому что 0хA=10)
167*16=2672 2672+11=2683
2683*16=42928 42928+8=42936
0хA7B8=42936
Преобразования чисел в системы счисления с другим основанием проводятся аналогично...
Теперь вы, типа, круты немеряно... У вас есть друзья, которые считают себя c00л х@цКеРамИ? Попросите их перевести в уме шестнадцатеричное 12 в двоичное. Ну, и за сколько кул хацкер это перевёл? Если больше чем за минуту, то без комментариев :-)
Если говорить откровенно систем счисления может быть хуева туча. И использовать для обозначения цифр можно и другие символы. Пример: троичная СС с цифрами %, *, _
%, *, _, *%, **, *_, _%, _*, __, *%%, *%*, *%_, **%...
Или вообще считать в 256-ричной системе счисления, используя в качестве "рисунка цифр" таблицу ASCII-символов! А теперь я расскажу вам секрет быстрого перевода 16чных чисел в двоичные, а заодно объясню, зачем вообще нужна 16чная СС (для тех, кто ещё не понял). Каждой шестнадцатеричной цифре соответствует тетрада (4 штуки) ноликов и единичек.
0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001
A = 1010
B = 1011
C = 1100
D = 1101
E = 1110
F = 1111
Все, что нужно сделать - "состыковать" эти тетрады. 0xA23F = 1010 0010 0011 1111. Компьютер, как известно, считает только в двоичной системе счисления. Человеку привычна десятичная. А 16чная - разумный компромисс :-)
Всё, пожалуй... Напоследок, хочу приложить файлец вырезанный из рассылки "Низкоуровневое программирование для дZенствующих" (надеюсь, они меня за это простят), кстати, для программирующих на ассемблере очень рекомендую.