Системы счисления
Попробую коротко передать суть шестнадцатеричной, десятичной и двоичной
системы счисления. Конечно многие могут подумать зачем все это надо, ведь
десятичная система привычна и удобна. Дело в том, что процессор оперирует двумя
разрядами 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
Вот пожалуй и все, в следующей статье научимся работать с отдельными битами с помощью встроенных функций языка. Всего доброго!
содержание | назад | вперед