::Главная страница :: Assembler :: Статьи ::
Кликай!
Низкоуровневое программирование для дZенствующих
Сайт:BY/RU.| Мыл: public/private.| Помощь: subscribe/unsubscribe/mail
ЕЖЕВОСКРЕСНЫЙ ЭЛЕКТРОННЫЙ ЖУРНАЛ ДЛЯ ИЗВРАЩЕНЦЕВ ОТ ПРОГРАММИРОВАНИЯ


Система счисления (radix)

Наверняка среди ваших знакомых есть "крутые" программисты или люди, таковыми себя считающие ;). Попробуйте как-нибудь проверить их "на вшивость". Предложите им в уме перевести число 12 из шестнадцатеричной в двоичную систему счисления. Если над подобным вопросом "крутой программист" будет думать дольше 10 секунд - значит он вовсе не так крут, как говорит...

   [2] Система счисления (сие не подвластное человеческой логике определение взято из математической энциклопедии) - это совокупность приемов представления обозначения натуральных чисел. Этих "совокупностей приемов представления" существует очень много, но самая совершенная из всех - та, которая подчиняется позиционному принципу. А согласно этому принципу один и тот же цифровой знак имеет различные значения в зависимости от того места, где он расположен. Такая система счисления основывается на том, что некоторое число n единиц (radix) объединяются в единицу второго разрада, n единиц второго разряда объединяются в единицу третьего разряда и т. д.

   [3] "Разрядам" нас учили еще в начальных классах школы. Например, у числа 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*10^4 + 5*10^3 + 6*10^2 + 7*10^1 + 2*10^0 (1)

   [4] Очень наглядно это отображают обыкновенные бухгалтерские счеты. Набранное на них число 35672 будет выглядеть следующим образом:

   Чтобы набрать число 35672 мы должны передвинуть влево две "костяшки" на первом "прутике", 7 на втором, 6 на третьем, 5 на четвертом и 3 на пятом. (У нас ведь 1 "костяшка" на втором - это то же самое, что и 10 "костяшек" - на первом, а одна на третьем равна десяти на втором - и так далее...) Пронумеруем наши "прутики" снизу вверх - да так, чтобы номером первого был "0"... И снова посмотрим на наши выражения:
  
 35672 = 3*10^4 + 5*10^3 + 6*10^2 + 7*10^1 + 2*10^0 --> это (если сверху вниз считать) сколько на каждом "прутике" "костяшек" влево отодвинуто;
   35672 = 3*10^4 + 5*10^3 + 6*10^2 + 7*10^1 + 2*10^0 --> это номер прутика (самый нижний - 0), на котором отодвинуто определенное число костяшек;
   35672 = 3*10^4 + 5*10^3 + 6*10^2 + 7*10^1 + 2*10^0 --> это на каждом прутике - по 10 костяшек нанизано, не все влево отодвинуты, но всего-то их - 10!
   Кстати, красненькое 10 в последнем выражении соответствует основанию (radix) системы счисления (number system).

(медитируйте)

   [5] Пальцев на руках у человека 10, поэтому и считать мы привыкли в системе счисления с основанием 10, то есть в десятичной. Если вы хорошо представляете себе счеты и немного поупражнялись в разложении чисел аналогично выражению 1, то перейти на систему счисления с основанием, отличным от привычной, особого труда для вас не составит. Нужно всего лишь представить себе счеты, на каждый прут которых нанизано не привычные 10 костяшек, а... скажем, 9 или 8, или 16 или 32 или 2 и... попробовать мысленно считать на них.

   [6]
Для обозначения десятичных чисел мы используем цифры от 0 до 9, для обозначения чисел в системах счисления с онованием менее 10 мы используем те же цифры: radix 9 - 0, 1, 2, 3, 4, 5, 6, 7, 8; radix 8 - 0, 1, 2, 3, 4, 5, 6, 7; radix 2 - 0, 1 и т. д. Если же основание системы счисления больше десяти, то есть больше, чем десять привычных нам чисел, то начинают использоваться буквы английского алфавита. Например, для обозначения чисел в системес числения с основанием 11 "как цифра" будет использоваться буква А: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A; в системе счисления с основанием 16 - буквы от A до F: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. И так далее... Правда, при определенном основании (при каком?) буквы аглицкого алфавита закончатся...
   Но нам это пока что глубоко фиолетово, так как работать мы будем только с тремя radix-ами: 10 (ну естественно), 16 и 2. Правда, если кто на ДВК поизучать это дело собирается, тому еще и radix 8 понадобится.

   [7] Числа в любой системе счисления строятся аналогично десятичной. Только на "счетах" не с 10, а с другим количеством костяшек.
   Например, когда мы пишем десятичное число 123, то имеем в виду следующее:

   1 раз 100 (10 раз по 10)
   + 2 раза 10
   + 3 раза 1

   Если же мы используем символы 123 для предоставления, например, шестнадцатеричного числа, то подразумеваем следующее:

   1 раз 256 (16 раз по 16)
   + 2 раза 16
   + 3 раза 1

   Короче - полный беспредел. Говорим одно, а подразумеваем другое. И последнее - не для красного словца сказано. А потому что так оно и есть...

   Истина где-то рядом...

   [8] Трудность у вас может возникнуть при использовании символов A, B, C и т. д. Чтобы решить эту проблему раз и навсегда, необходимо назубок вызубрить ма-а-аленькую табличку "соответствия" между употребляемыми в "компьютерном деле" систем счисления:

radix 10
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
radix 16
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
radix 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

   Вот и объединили цифры с буквами. Пространство со временем поучимся объединять немного позже - если не испугаетесь сложностей низкоуровневого программирования.
   В общем-то решать вам. В Delphi тоже много чего объединять можно.

   [9] Двоичная система по-компьютерному обзывается "bin", "родная" десятичная - "dec", а шестнадцатеричная - "hex". Это так компьютерщики обозвали те системы счисления, с которыми имеют дело... А обозвали потому, что у них ведь полный бардак в голове, оказывается!
   Например, 10 - что это за число? Да это вообще не число! Палка и барабан - и только... А вот 10d или же 10_10 - уже понятно, что это - число, соответствующее количеству пальцев на обеих руках. И именно на обеих а не на двух. Почему не на двух? - А потому что на двух в какой системе? Ежели в двоичной, так это на десяти! То бишь 100, если в десятичной...
   Вот и придумали программисты после числа буковку писать - b, d или h. А самые линивые еще и директиву специальную придумали: напишут в самом начале программы какай-нибудь .radix 16 и будут автоматически все числа, которые без этих букв, за шестнадцатеричные приниматься.    

   [10] Еще немного про перевод между "радиксами". (Вообще-то это плевое дело - конечно, если представляешь себе, что такое "совокупность приемов представления обозначения натуральных чисел").
   Например, преобразование числа 42936 из десятичного в шестнадцатеричный формат проводится следующим образом (в скобках - остаток):

   42936/16 = 2683(8)         8 - младшая цифра
   2683/16 = 167(11)           B (11d=Bh по таблице)
   167/16 = 10(7)               7
   10/16 = 0(10)                 A - старшая цифра
   ----------------------------------------
   42936d=A7B8h

    А вот и обратный процесс - перевод из HEX в DEC числа A7B8h:

   10*16=160 160+7=167 (10 - потому что Ah=10d)
   167*16=2672 2672+11=2683
   2683*16=42928 42928+
8=42936
   ----------------------------------------
   A7B8h=42936d

   Преобразования чисел в системы счисления с другим основанием проводятся аналогично... Счеты! Обыкновенные бухгалтерские счеты, только с "плавающим" числом "костяшек" на каждом "прутике"...

(медитируйте)

   [11] Если чесна, то конкретный "рисунок" цифр - единица там палкой обозначается, двойка - лебледем - это все лишь историческая случайность. Мы запросто можем считать в "троичной" системе счисления с цифрами %, *, _ (где запятая - это знак препинания, а вовсе не число):

%, *, _, *%, **, *_, _%, _*, __, *%%, *%*, *%_, **%...

   Или использовать родные цифры в десятичной системе счисления, но по другому "вектору упорядоченных цифр" - 1324890576

   1, 3, 2, 4, 8, 9, 0, 5, 7, 6, 31, 33,34, 34,38, 39, 30, 35, 37...

   Правда, этим немножко затрудняется понимание происходящего? А ведь тоже десятичная система! И рисунок цифр как-бы знакомый :-)))
   Или вообще считать в 256-ричной системе счисления, используя в качестве "рисунка цифр" таблицу ASCII-символов! (По сравнению с вами-извращенцами любой Биллгейтс будет девственником казаться!!).

   [12] Теперь самая интересная часть Марлезонского балета.
   Компьютер, как известно, считает только в двоичной системе счисления. Человеку привычна десятичная. Так нахрена еще и шестнадцатеричную какую-то знать нужно?
   Все очень просто. В умных книжках пишут, что "шестнадцатеричная нотация является удобной формой представления двоичных чисел". Что это значит?
   Переведите число A23F из шестнадцатеричной "нотации" в двоичную. (Один из возможных алгоритм  приведен в п. 10.). В результате длительных манипуляций у вас долно получиться 1010001000111111.
   А теперь еще раз посмотрите на таблицу в п. 8. (которую вы как бы уже и выучили) и попробуйте то же самое сделать в уме :

   Ah=1010b
   2h=0010b
   3h=0011b
   Fh=1111b

A23Fh = 1010 0010 0011 1111b

   Каждой шестнадцатеричной цифре соответствует тетрада (4 штуки) ноликов и единичек. Все, что потом нужно сделать - "состыковать" эти тетрады. Круто? Вас еще не то ждет!

   [13] Кстати (наверняка вы это уже знаете):

00000123 = 123 но,
123 <> 12300000

   ... но это так... кстати...

   [14] И, напоследок, еще несколько слов про HEX и BIN :). Зайдите в Norton Commander, наведите указатель на какой-нить файл и нажмите там F3. А когда он откроется - на F4. Там какие-то нездоровые циферки попарно сгруппированы. Это и есть "нолики и единички" (которыми в компьютере все-все-все описывается) но в шестнадцатеричном формате...

(медитируйте)

 

ПРЕДУПРЕЖДЕНИЕ

   Следует основательно разобраться с системой счисления. Минимум, что должен вынести из этой главы юзвер, вступивший на скользкий путь низкоуровневого программирования - это научиться переводить числа между DEC, HEX и BIN... хе-хе... В УМЕ!

Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.