Побитовая работа с переменными

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Мигаль
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 05.07.2004 (Пн) 16:56

Побитовая работа с переменными

Сообщение Мигаль » 05.07.2004 (Пн) 17:12

Как нибудь можно скопировать содержимое одной переменной в другую разных типов, напр. тип Single в Long? Т.е. речь идет не о преобразовании типов, а именно о копировании содержимого памяти. И есть ли какие то аналоги C++ memcpy и т.п
(а вообще то необходимо разбить Single на 2 Integer).
И еще: имеются ли в VB сдвиговые операции?

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 05.07.2004 (Пн) 19:00

Можешь использовать API-функцию CopyMemory:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
А сдвиговых операций, насколько мне известно нету. Придется либо искуственно это писать самому, либо ДЛЛ на С подключать. Может я ошибаюсь? :roll: Надо у опытных спросить.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 05.07.2004 (Пн) 19:11

Лови прогу. Тут правда не сингл, а лонг, но принцип тот же самый
-------------------------------------------------------
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Type str
a As Integer
b As Integer
End Type
Private Sub Form_Load()
Dim proba As str, c As Long
c = &HFFFFAAAA
CopyMemory proba, c, LenB(c)
MsgBox Hex(proba.b) & " " & Hex(proba.a)
End Sub

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Побитовая работа с переменными

Сообщение Approximator » 06.07.2004 (Вт) 2:11

Мигаль писал(а):Как нибудь можно скопировать содержимое одной переменной в другую разных типов, напр. тип Single в Long? Т.е. речь идет не о преобразовании типов, а именно о копировании содержимого памяти. И есть ли какие то аналоги C++ memcpy и т.п
(а вообще то необходимо разбить Single на 2 Integer).

Можно даже не копируя создать массив из n-ого количества целых чисел, ссылающийся на эти же данные. Вот код (твоя переменная называется lSing):

Код: Выделить всё
Public Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (ByRef vArr() As Any) As Long

Public Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)


Dim ASA as Long, IntArr() as Integer
ReDim IntArr(1 to ENumb)
CopyMem VarPtr(ASA), ArrPtr(IntArr), 4
CopyMem ASA+12, VarPtr(lSing), 4


Далее можете юзать (но не обновлять!) целые числа, как фрагменты Single (младшие байты начинаются с младшего индекса). И всех делов.

И еще: имеются ли в VB сдвиговые операции?


Библиотечные, наверное, есть. Но мы про них не знаем. А вот эмулировать их труда точно не представляет. Для простоты я покажу на примере байта.
Двигаем "вперёд" (от младшего к старшему):

Код: Выделить всё
Dim lB as Byte

lB = Value

if (lB And &H80) Then
lB=(lB-128)*2+1
Else
lB=lB*2
End if


Теперь :) "вертаем взад" :) (от старшего к младшему):

Код: Выделить всё
Dim lB as Byte

lB = Value

if (lB And &H1) Then
lB=(lB-1)\2+128
Else
lB=lB\2
End if
С уважением, Approximator.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Diamock и гости: 34

    TopList