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

Попробую коротко передать суть шестнадцатеричной, десятичной и двоичной системы счисления. Конечно многие могут подумать зачем все это надо, ведь десятичная система привычна и удобна. Дело в том, что процессор оперирует двумя разрядами 0 и 1 , а значит он может работать, используя только двоичную систему счисления. И если нам понадобится  наибольшая гибкость при работе с числами, то без понимания двоичной системы счисления, трудно оперировать двоичной логикой. Более того есть куча функций, параметры которых оперируют с битами, а значит вам все равно придется столкнуться с ними.
 Что касается шеснадцатеричных чисел, то эти числа придуманы как промежуточные между десятичной и двоичной системой счисления. Ведь трудно понять что за число скрывается за вереницей нулей и единиц (хотя раньше так тоже программировали). Двоичные числа несложно преобразуются в шестнадцатеричные. Более того, во многих случаях запись в шестнадцатеричном представлении более коротка и наиболее читаема.  Шестнадцатеричные числа используются абсолютно каждым отладчиком и HEX редактором. Кроме того эти числа популярно привиты пользователям для определения и установки значений цвета. 

И так посмотрите на табличку сравнения двоичных , десятичных и шестнадцатеричных чисел:


десятичное число двоичное число шестнадцатеричное число
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16 10000 10
17 10001 11
18 10010 12
19 10011 13
20 10100 14

 

Чтобы понять как устроена последовательность построения двоичных чисел в таблице, нужно вспомнить простое сложение. Когда мы увеличиваем десятичное число и оно не помещается в один разряд, мы попросту увеличиваем старший разряд на единицу(если его нет, то создаем):

1+8=9
1+9=10  <- увеличение старшего разряда

В двоичных числах так же , там ведь нет ничего кроме 0 и 1. Именно поэтому там старшее число 1 , а прибавление к ней единицы дает такой же эффект как в десятичном числе:

1+1=10  <- увеличение старшего разряда

В шестнадцатеричном представлении точно так же. Только там самое старшее число F и прибавление к нему единицы дает перенос в старший разряд.

F+1=10  <- увеличение старшего разряда

В шестнадцатеричном представлении для получения 16-ти разрядов были добавлены буквы: A,B,C,D,E,F.
Из таблицы видно, что границы 4х битового двоичного числа совпадают с границей шестнадцатеричного числа и представляют собой половину байта. То есть целый байт будет выглядеть так:

11111111  <- двоичное число

FF <- шестнадцатеричное число

Так к примеру что может сказать десятичное число: 16711680 при установке или определении цвета? А в шестнадцатеричном представлении это число выглядит так: FF0000 и для определения цвета более читаемо, поскольку говорит что это красный цвет в представлении RGB (красный , зеленый , синий) . Для каждого цвета свой байт и как видите значения красного самое большое, а для остальных составляющих значения равны 0.
Оперируя битами с помощью ASM вставок, можно добиться высокой скорости. К примеру вы наверно заметили, что если в двоичном числе старший бит сдвинуть влево, приписав справа 0) , то число увеличивается в два раза. То есть это по сути возведение в степень двойки , и работать это будет однозначно быстрее, чем возведение в степень с помощью стандартного оператора, ведь работа с битами родная процессору. В FreeBasic есть операторы для работы с битами и мы их в следующей статье разберем.
Описывать принципы теоретического преобразования из одной системы счисления в другую не буду. Мне не хочется сейчас углубляться в математику и тем превратить статью в сонный наркотик. Такую информацию при желании вы легко найдете в поисковиках. Она общая для всех языков программирования. С другой стороны операторы языка для преобразования в этой статье рассмотрены будут.

 

Обозначения двоичных и шестнадцатеричных чисел

Что касается десятичного числа, то тут наверно все ясно. Но для отделения компилятором двоичных и шестнадцатеричных чисел, перед числом нужно указывать:

&b   для двоичного числа

&h   для шестнадцатеричного числа

Пример:

&b11111111   <- двоичное число

&hFF  <- шестнадцатеричное число

 

Преобразование из одной системы в другую с помощью операторов

 

BIN

Для того, чтобы получить строковое двоичное представление числа, в языке есть перегруженная функция BIN. Данные строковые представления нередко используются разными функциями, работающими с графикой и не только.

Ее синтаксис:

Bin Overload ( ByVal number As Byte ) As String
Bin ( ByVal number As Short ) As String
Bin ( ByVal number As Integer ) As String
Bin ( ByVal number As Integer, ByVal digits As Integer ) As String
Bin ( ByVal number As LongInt ) As String
Bin ( ByVal number As LongInt, ByVal digits As Integer ) As String

number - число для преобразования
digits - кол-во преобразуемых возвращаемых битов.

Пример:

? Bin (255)
? Bin(255,4)
Sleep


Обратная операция для преобразования строкового двоичного представления в числовой тип делается с добавлением соответствующего префикса (&b) и знакомого нам оператора VAL

Пример:

Dim As Integer A
Dim As String ST
ST = Bin (255)
A = Val("&b" & ST)
? ST
? A
Sleep

 

HEX

Для преобразования значения в строковое представление шестнадцатеричного числа, можно воспользоваться перегруженной функцией HEX.

Синтаксис:

Hex Overload ( ByVal number As Byte ) As String
Hex ( ByVal number As Short ) As String
Hex ( ByVal number As Integer ) As String
Hex ( ByVal number As Integer, ByVal digits As Integer ) As String
Hex ( ByVal number As LongInt ) As String
Hex ( ByVal number As LongInt, ByVal digits As Integer ) As String

number - число для преобразования
digits - кол-во преобразуемых возвращаемых цифр.

Пример:

? Hex (5000070)
? Hex(5000070,4)
Sleep

Обратная операция для преобразования строкового шестнадцатеричного представления в числовой тип делается с добавлением соответствующего префикса (&h) и знакомого нам оператора VAL

Пример:

Dim As Integer A
Dim As String ST
ST = Hex(255)
A = Val("&h" & ST)
? ST
? A
Sleep


На самом деле, когда я называл системы счисления я не упомянул еще одну, хоть и редко используемую: восьмеричная. Честное слово, я довольно много исходников видел, но не в одном из них не встретил , чтобы кто-то нашел практическое применение этой системы счисления. Принцип у нее тот же что у остальных систем, поэтому покажу лишь пример функции OCT для преобразования в эту систему:

Пример:

? Oct(5000070)
? Oct(5000070,4)
Sleep


Обратная операция для преобразования строкового восьмеричного представления в числовой тип делается с добавлением соответствующего префикса (&O) и знакомого нам оператора VAL

Пример:

Dim As Integer A
Dim As String ST
ST = Oct(255)
A = Val("&O" & ST)
? ST
? A
Sleep

Вот пожалуй и все, в следующей статье научимся работать с отдельными битами с помощью встроенных функций языка. Всего доброго!

содержание | назад | вперед