Поиск по сайту:


«VBA Булевские вектора и операции для работы с ними»

Файл: 4 КБ
Поделиться:
Напомним, что в VBA имеется тип Boolean - для хранения логических (булевых) значений, которые сохраняются как 16-разрядные (двухбайтовые) числа, но могут иметь только значения True или False. Переменные типа Boolean отображаются как строковые значения True или False при использовании метода Print. Для присваивания переменным логических значений ИСТИНА или ЛОЖЬ следует использовать ключевые слова True или False.
При преобразовании других числовых типов данных к типу Boolean значение 0 преобразуется в False, а все остальные значения преобразуются в True. Если значения типа Boolean преобразуются к другим типам данных, то False превращается в 0, а True в -1.По умолчанию значением булевской переменной является False- ложь.
Любое число можно представить в двоичном виде, а полученный набор нулей и единиц рассматривать как булевский вектор. Для получения представления числа в двоичном виде можно использовать следующий код:
Sub пример8()
Dim b As String
Dim s As Single
Dim a As Integer
b = ""
s = CSng(InputBox("Введи десятичное", "Ввод данных", 255))
Do While s > 0
a = s Mod 2#
b = CStr(a) + b
s = (s) \ 2#
Loop
MsgBox b, vbOKOnly, "Результат"
End Sub
Для преобразования двоичного представления числа в его десятичное значение можно использовать следующий код:
Sub пример9()
Dim b As String
Dim i As Integer, l As Integer, k As Integer, j As Integer
b = InputBox("Введи двоичное", "Ввод данных", 11111111)
l = Len(b)
i = 0
For k = l To 1 Step -1
j = CInt(Mid(b, k, 1))
i = i + j * 2 ^ (l - k)
Next
MsgBox i, vbOKOnly, "Результат"
End Sub
При работе с булевскими векторами часто приходится выделять из них конкретные разряды, тетрады (4 разряда), байты (2 тетрады) и слова (2 байта, 4 тетрады). Для этого применяются операции маскирования и/или сдвига. Маскирование представляет собой наложение на число (с помощью операции И) некоторой маски - числа, содержащего единицы в нужных разрядах и нули - в ненужных:
0001 0111 AND 0000 1111 = 0000 0111
Сдвиг представляет собой операцию добавления к числу слева или справа без изменения его разрядности указанного количества нулей. Вытолкнутые разряды при этом теряются:
0001 0111 SHL 4 = 0111 0000, 0001 0111 SHR 4 = 0000 0001
Для сдвига вправо двоичного представления числа b на i разрядов можно использовать код:
shr = Left(b, Len(b) - i)
Для сдвига влево двоичного представления числа b на i разрядов можно использовать код:
shl = Right(b, Len(b) - i)
shl=shl+String(i,"0")
Для работы с булевскими векторами применяются логические операции:
логические операции, используемые для выполнения логических операций
Рассмотрим пример: Выделить в двухбайтовом слове 1ю и 3ю тетрады и объединить их по исключающему ИЛИ.
Для решения этой задачи необходимо сохранить заданное число (больше 255) во вспомогательной переменной, ввести маску 0000 0000 0000 1111 для выделения 1 тетрады, перевести ее в десятичный вид и объединить ее по И с заданным числом, ввести маску 0000 1111 0000 0000 для выделения 3 тетрады, перевести ее в десятичный вид и объединить ее по И с копией заданного числа и сдвинуть вправо на 8 разрядов, после чего объединить полученные значения с помощью операции XOR. Представленная ниже программа использует процедуру tobin для получения двоичного представления числа и функции toint для перевода двоичного представления к десятичному значению и shr для сдвига вправо.
Sub пример10()
Dim a As Integer, b As Integer, m1 As Integer, m2 As Integer, rez As Integer
a = CInt(InputBox("Введи число", "Ввод данных", 256))
Call tobin(a): b = a
m1 = toint("111100000000")
m2 = toint("1111")
a = a And m1
Call tobin(a)
a = toint(shr(a, 8))
b = b And m2
Call tobin(b)
rez = a Xor b
Call tobin(rez)
End Sub