Страницы: 1
RSS
Массив битов десятичного числа [VBA]
 
Доброе время суток, коллеги.
Есть у меня необходимость получить десятичное число в виде массива битов заданной размерности D, например, для D=4
Код
A(i) = Array(0,0,1,0) ' двойка 
A(i) = Array(0,1,0,1) ' пятерка
Точнее, задача стоит создать массив A(1 To X), содержащий массивы битов для чисел в интервале от 1 до X.
При этом правильно ли я понимаю, что X - это число, соответствующее 2^D - 1?

В связи с этим вопрос - как можно это экономно сделать в VBA,  определив заранее размер массива по верхней границе диапазона?
Все, что нашел пока - алгоритмы  для С++, Java и прочего, которые я перевести не могу.
Воспользовался алгоритмом из Википедии (вычисление остатков от деления на 2), но он какой-то громоздкий.

Есть какие-то более правильные решения?
F1 творит чудеса
 
Код
Sub qq()
    a = 5
    aa = Format(Application.WorksheetFunction.Dec2Bin(a), "0 0 0 0")
    aaa = Split(aa)
End Sub
 
спасибо! но для больших чисел не годится, увы. D может быть, например, 10 и больше, соответственно максимальное число, для которого нужно создать массив, 1023, а если число < -512 или если число > 511 то, ДЕС.В.ДВ возвращает значение ошибки #ЧИСЛО!
F1 творит чудеса
 
организовать это в VBA
 
Цитата
Максим Зеленский пишет: но он какой-то громоздкий
???
Код
Sub qqq()
x = 1925689
Do
xx = x / 2
x = Int(xx)
ss = (xx - Int(xx)) * 2
sss = ss & " " & sss
Loop Until x = 0
End Sub
И сплитом его
Изменено: RAN - 25.11.2014 23:26:49
 
ну вот так и делаю, наверное...
Код
Sub DecTwoBin()
Dim x&, D&, i&, A, B, r&, k&
D = 4 ' разрядность
x = 2 ^ D - 1 'верхняя граница
ReDim A(1 To x)
For i = 1 To x
 ReDim B(1 To D) As Double
 r = i
 k = D
 Do While r > 0
    B(k) = r Mod 2
    k = k - 1
    r = Int(r / 2)
 Loop
 A(i) = B
Next
' обработка
End Sub
 
F1 творит чудеса
 
Код
Function GBin(L As Long)
If L > 1 Then
  GBin = GBin(L \ 2) & L Mod 2
Else
  GBin = CStr(L)
End If
End Function
 sub test() 
 msgbox format(GBin(1000),"0000")
end sub
Исправил, сократил не проверив  :)  

в массив сами переведете
Изменено: B.Key - 25.11.2014 23:39:22
 
Цитата
RAN пишет:
x = Int(xx)
ss = (xx - Int(xx)) * 2
наверное
Код
ss = (xx - x))
?? А то что-то я к ночи уже не соображу

B.Key, спасибо! Пока воткнул, что это рекурсия, долго пытался понять, что за функция такая  :)  осталось понять логику
F1 творит чудеса
 
::) я по нему учился
Справочник по схемотехнике
 
Спасибо всем! Эх, не на того я учился  :D  приходится какие-то азы чуть ли не заново изобретать большой кровью, особенно в части алгоритмов
F1 творит чудеса
Страницы: 1
Наверх