Don Leno писал(а):А как сохранить эти значения в файл и сколько они будут занимать места?
31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0
dec bin
2^0 = 1 = 00000001
2^1 = 2 = 00000010
2^2 = 4 = 00000100
2^3 = 8 = 00001000
2^4 = 16 = 00010000
2^5 = 32 = 00100000
2^6 = 64 = 01000000
2^7 = 128 = 10000000
v& = v& or 1 ' установлен бит под номером 0
v& = v& or 64 ' установлен бит под номером 6
v& = v& and (not 1) ' сбросить бит 0
v& = v& and (not 64) ' сбросить бит 6
v& = v& or 12 ' установить биты 2 и 3. 12 = 2^2 + 2^3 = 4 + 8
v& = v& or 255 ' установить биты 0-7
v& = v& and (not 12) ' сбросить биты 2 и 3
bitpart& = (v& and 12) \ 4
If v& and 64 then ' истина, ести бит 6 установлен
If (v And 32) Then
If (v And 128) Then
Debug.Print "Оба бита (5 и 7) установлены"
End If
End If
If (v And 32) or (v And 128) Then
Debug.Print "Один из бит установлен"
End If
Put #[дескриптор_файла], [позиция_записи_в_файле], [переменная_или_массив]
Function ValueToBin(ByVal value As Long) As String
Const ConvTable$ = "0000000100100011010001010110011110001001101010111100110111101111"
' ====----====----====----====----====----====----====----====----
' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Dim i As Long, qbitpart As Long, msb As Boolean
ValueToBin = String(39, " ")
If value And &H80000000 Then
value = value And Not &H80000000: msb = True
End If
For i = 7 To 0 Step -1
qbitpart = value And &HF: value = value \ &H10
Mid$(ValueToBin, i * 5 + 1, 4) = Mid$(ConvTable, qbitpart * 4 + 1, 4)
Next i
If msb Then Mid$(ValueToBin, 1, 1) = "1"
End Function
Dim bVal As Byte
Dim iVal As Integer
Dim lVal As Long
bVal = 153 ' = &H99
iVal = 19455 ' = &H4BFF
'lVal = &HBEDECAFE ' переполнение
Debug.Print Hex(bVal), Right(ValueToBin(CLng(bVal)), 9)
Debug.Print Hex(iVal), Right(ValueToBin(CLng(iVal)), 19)
lVal = &H3EDECAFE
Debug.Print Hex(lVal), ValueToBin(lVal)
Debug.Print "80000000", ValueToBin(&H80000000)
lVal = lVal Or &H80000000
Debug.Print Hex(lVal), ValueToBin(lVal)
Dim BinaryRepresentation As String ' объявление текстовой переменной
BinaryRepresentation = ValueToBin(5616)
5616 = 1 0101 1111 0000
351 = 0 0001 0101 1111 (обычно, если все старшие биты, которые слева, равны нулю, то они не пишутся)
Function ValueToBin(ByVal value As Long) As String
Const ConvTable$ = "0000000100100011010001010110011110001001101010111100110111101111"
' ====----====----====----====----====----====----====----====----
' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Dim i As Long, qbitpart As Long, msb As Boolean
' Резервирование места под результат
' строка заполняется пробелами
' 39 = 32 (кол-во бит) + 7 (пробелы между четырмя битами)
ValueToBin = String(39, " ")
' Проверка 31-го бита (самого старшего в переменной value)
If value And &H80000000 Then
' Сброс верхнего бита в переменной. Это нужно для последующих сдвигов.
' такая ситуация вытекает из особенностей интерпритации целого числа со знаком.
value = value And Not &H80000000
' так как бит сброшен, то в переменной msb запоминается этот факт
msb = True
End If
' 32 (кол-во бит) / 4 = 8
' цикл от 7 до 0, всего 8 итераций
For i = 7 To 0 Step -1
' вычисление номера кубита (четырёх бит) в ConvTable
' Если в маске бит = 1, то в результате он остаётся.
' Это вытекает из таблицы истинности оператора AND (Конъюнкция)
' V M R (V - переменная, M - маска, R - результат)
' 0 AND 0 = 0
' 0 AND 1 = 0
' 1 AND 0 = 0
' 1 AND 1 = 1
' для числа 5616
' V = 5616 = 0000 0000 0000 0000 0001 0101 1111 0000
' M = 15 = &HF = 0000 0000 0000 0000 0000 0000 0000 1111
' R = 0000 0000 0000 0000 0000 0000 0000 0000
qbitpart = value And &HF
' qbitpart = 0
' сдвиг бит на 4 позиции вправо
' используется целочисленное деление "\"
value = value \ &H10
' value = 0000 0000 0000 0000 0000 0001 0101 1111
' для следующей итерации qbitpart примет значение 15
' копирование в результирующую переменную текстового представления
' младших четырёх бит заданного числа в аргументе функции
' i = 7, выражение i * 5 + 1 примет значение 7 * 5 + 1 = 35 + 1 = 36
' это получилась позиция вставки в результирующую строку
'
' qbitpart = 0, выражение qbitpart * 4 + 1 примет значение 0 * 4 + 1 = 0 + 1 = 0
' это получилась позиция копирования из ConvTable
' по этой позиции возьмётся текст "0000"
Mid$(ValueToBin, i * 5 + 1, 4) = Mid$(ConvTable, qbitpart * 4 + 1, 4)
Next i
' если в исходном числе был снят старший бит, то в результате
' нужно первый символ установить в "1"
If msb Then Mid$(ValueToBin, 1, 1) = "1"
End Function
Dim Variable As Long
Variable = Variable Or 2^7
Dim Variable As Long
Dim Mask as Long
Variable = 255
Mask = 2^3
Mask = Not Mask
Variable = Variable And Mask
Сейчас этот форум просматривают: Google-бот и гости: 28