Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
Kolobuk
-
- Обычный пользователь
-
-
- Сообщения: 61
- Зарегистрирован: 24.10.2006 (Вт) 20:03
Kolobuk » 08.02.2007 (Чт) 21:36
Привет.
Есть:
- Код: Выделить всё
Dim Massiv(3) As Byte
Есть:
- Код: Выделить всё
Dim Chislo As Long
Как представить Chislo в виде Massiv(3)?
Т.е. как разбить 4-х байтное число на массив байт?
-
BV
-
- Thinker
-
-
- Сообщения: 3987
- Зарегистрирован: 12.09.2004 (Вс) 0:55
- Откуда: Молдавия, г. Кишинёв
-
BV » 08.02.2007 (Чт) 21:50
And'ом
Например, Chislo And &HFF& - старший байт.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
-
Хакер
-
- Телепат
-
-
- Сообщения: 16478
- Зарегистрирован: 13.11.2005 (Вс) 2:43
- Откуда: Казахстан, Петропавловск
-
Хакер » 08.02.2007 (Чт) 22:03
Kolobuk
Выделением каждого байта с помощью And либо CopyMemory
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.
-
Kolobuk
-
- Обычный пользователь
-
-
- Сообщения: 61
- Зарегистрирован: 24.10.2006 (Вт) 20:03
Kolobuk » 08.02.2007 (Чт) 22:15
And'ом
Например, Chislo And &HFF& - старший байт.
Ух ты. Круто.
Спасибо.
---------
А два остальных байта как???
-
tyomitch
-
- Пользователь #1352
-
-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 08.02.2007 (Чт) 22:23
BV писал(а):Например, Chislo And &HFF& - старший байт.
И как раз-таки младший.
-
BV
-
- Thinker
-
-
- Сообщения: 3987
- Зарегистрирован: 12.09.2004 (Вс) 0:55
- Откуда: Молдавия, г. Кишинёв
-
BV » 08.02.2007 (Чт) 23:12
Да, младший.
Старший так:
Chislo / &HFFFFFF& And &HFF&
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
-
alibek
-
- Большой Человек
-
-
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 08.02.2007 (Чт) 23:26
Но лучше все-таки CopyMemory или LSet.
Lasciate ogni speranza, voi ch'entrate.
-
Kolobuk
-
- Обычный пользователь
-
-
- Сообщения: 61
- Зарегистрирован: 24.10.2006 (Вт) 20:03
Kolobuk » 08.02.2007 (Чт) 23:26
Старший и младший теперь понятны.
А 2 промежуточных? Ведь Лонг 4 байта занимает.
-
tyomitch
-
- Пользователь #1352
-
-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 09.02.2007 (Пт) 7:22
BV писал(а):Да, младший.
Старший так:
Chislo / &HFFFFFF& And &HFF&
Срабатывает только за счёт округления.
А должно быть Chislo \ &H1000000 And &HFF
-
BV
-
- Thinker
-
-
- Сообщения: 3987
- Зарегистрирован: 12.09.2004 (Вс) 0:55
- Откуда: Молдавия, г. Кишинёв
-
BV » 09.02.2007 (Пт) 18:52
В общем, так. Дело было вечером...
- Код: Выделить всё
Option Explicit
Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Type Int32_2
LWord As Integer 'Младшее слово
HWord As Integer 'Старшее слово
End Type
Private Type Int32_4
LByte1 As Byte 'Младший байт
LByte2 As Byte
HByte2 As Byte
HByte1 As Byte 'Старший байт
End Type
Dim int32Number2 As Int32_2
Dim int32Number4 As Int32_4
Dim lNumber As Long
Private Sub cmdBegin_Click()
With int32Number2
.LWord = -15846
.HWord = 24791
End With
Call RtlMoveMemory(lNumber, int32Number2, 4)
Dim intWord As Integer
Dim bByte As Byte
Me.CurrentX = 10 * Screen.TwipsPerPixelX
Me.CurrentY = 10 * Screen.TwipsPerPixelX
Me.Print "Результат разложения lNumber на 2 слова (Word):" & vbCrLf
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(intWord, lNumber, 2)
Me.Print "LoWord: " & Str$(intWord)
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(intWord, ByVal VarPtr(lNumber) + 2&, 2)
Me.Print "HiWord: " & Str$(intWord)
With int32Number4
.LByte1 = 165
.LByte2 = 49
.HByte2 = 237
.HByte1 = 198
End With
Call RtlMoveMemory(lNumber, int32Number4, 4)
Me.Print
Me.CurrentX = 10 * Screen.TwipsPerPixelX
Me.Print "Результат разложения lNumber на 4 байта:" & vbCrLf
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(bByte, lNumber, 1)
Me.Print "LoByte1: " & Str$(bByte)
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 1&, 1)
Me.Print "LoByte2: " & Str$(bByte)
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 2&, 1)
Me.Print "HiByte2: " & Str$(bByte)
Me.CurrentX = 20 * Screen.TwipsPerPixelX
Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 3&, 1)
Me.Print "HiByte1: " & Str$(bByte)
End Sub
Если у кого есть желание сделать этот же пример через And -- милости прошу
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
-
ANDLL
-
- Великий гастроном
-
-
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
ANDLL » 09.02.2007 (Пт) 19:24
Эмм, GSerg выкладывал класс для битовых операций то ли в кирпичах то ли в популярных вопросах. В том числе там было и все нужное автору
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог
-
Andrey Fedorov
-
- Член-корреспондент академии VBStreets
-
-
- Сообщения: 3287
- Зарегистрирован: 21.05.2004 (Пт) 9:28
- Откуда: Москва
Andrey Fedorov » 09.02.2007 (Пт) 21:28
Ведь
alibek давно ответ дал - трудно попробовать?
- Код: Выделить всё
Private Type tb
b1 As Byte
b2 As Byte
b3 As Byte
b4 As Byte
End Type
Private Type ta
a(3) As Byte
End Type
Private Type ti
i As Long
End Type
Public Sub Main()
Dim ii As ti, bb As tb, aa As ta
Debug.Print "---"
ii.i = 1025
LSet bb = ii
Debug.Print "1:", ii.i, bb.b4, bb.b3, bb.b2, bb.b1
LSet aa = ii
Debug.Print "2:", ii.i, aa.a(3), aa.a(2), aa.a(1), aa.a(0)
Debug.Print "==="
End Sub
Что еще надо для счастья?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...
-
EUGY
-
- Бывалый
-
-
- Сообщения: 214
- Зарегистрирован: 09.11.2006 (Чт) 22:51
- Откуда: Мурманск
EUGY » 10.02.2007 (Сб) 6:08
' Почти в тему
Dim e(2) As Byte
Dim l As Long
l = RGB(255, 100, 200)
Call CopyMemory(e(0), l, 3)
Debug.Print e(0) & " R-value"
Debug.Print e(1) & " G-value"
Debug.Print e(2) & " B-value"
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: Google-бот, YaCy [Bot], Yandex-бот и гости: 16