Системы счисления

Система счисления - это совокупность приемов представления обозначения натуральных чисел. Этих "совокупностей приемов представления" существует очень много, но самая совершенная из всех - та, которая подчиняется позиционному принципу. А согласно этому принципу один и тот же цифровой знак имеет различные значения в зависимости от того места, где он расположен. Такая система счисления основывается на том, что некоторое число 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енствующих" (надеюсь, они меня за это простят), кстати, для программирующих на ассемблере очень рекомендую.

Hosted by uCoz