Разбить Long

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

Разбить Long

Сообщение artyuha » 20.02.2005 (Вс) 23:44

Привет всем!

Вот возник тут у меня такой вопрос. Как 4-х байтное целое раскидать по 4-м одно байтным.

Я думаю, что примерно так:

Dim L as long

L=36000000

Dim f1, f2, f3, f4 As Byte

f1 = L / 256 ^ 3
f2 = (L - f1 * 256 ^ 3) / 256 ^ 2
f3 = (L - f1 * 256 ^ 3 - f2 * 256 ^ 2) / 256
f4 = (L - f1 * 256 ^ 3 - f2 * 256 ^ 2 - f3 * 256)
MsgBox f1 & ":" & f2 & ":" & f3 & ":" & f4

, но при этом выйдут запары с округлением чисел. Т. е. Мне надо так разделить, чтоб остаток от деления не принимался во внимание.
:roll:

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 20.02.2005 (Вс) 23:47

Int откидывает дробную часть числа т.е. (наверное) остаток!
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.02.2005 (Вс) 23:53

Код: Выделить всё
Dim byte1 As Byte, byte2 As Byte, byte3 As Byte, byte4 As Byte
Dim sum As Long

sum = 255& * 255& * 255& * 15

byte1 = sum \ 255 \ 255 \ 255
byte2 = (sum - byte1 * 255& * 255& * 255&) \ 255
byte3 = sum - byte1 * 255& * 255& * 255& - byte2 * 255& * 255&
byte4 = sum - byte1 * 255& * 255& * 255& - byte2 * 255& * 255& - byte3 * 255&

MsgBox sum = byte1 * 255& * 255& * 255& + byte2 * 255& * 255& + byte3 * 255& + byte4

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 23:53

Оператор деления без остатка - "\"
Код: Выделить всё
MsgBox 10 \ 3 ' выведет 3

Int здесь не нужен.


[edit]2Amed: :shock:[/edit]
[edit2]2AAZ: :oops:[/edit2]
Последний раз редактировалось tyomitch 20.02.2005 (Вс) 23:57, всего редактировалось 3 раз(а).
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 20.02.2005 (Вс) 23:54

Противоречишь сам себе ;) То "/", то "\" ;)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.02.2005 (Вс) 23:56

tyomitch писал(а):[edit]2Amed: :shock:[/edit]
[edit2]2AAZ: :oops:[/edit2]

:D
:lol:
:P
Последний раз редактировалось Amed 21.02.2005 (Пн) 0:08, всего редактировалось 2 раз(а).

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 20.02.2005 (Вс) 23:57


A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 20.02.2005 (Вс) 23:59

Блин, че-то сообщения слишом быстро добавляются :) Я, как обычно, не в тему :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.02.2005 (Пн) 0:01

Эх, жалко alibek-а нету, а то бы початились... :lol:
Изображение

artyuha
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 07.09.2004 (Вт) 3:47

Сообщение artyuha » 21.02.2005 (Пн) 0:01

Нефига. Пишу:

Dim L As Long

L = 36.6

Print Int(L)

Выдаёт 37. Хотя Print Int(36.6) выдаёт 36 :shock:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.02.2005 (Пн) 0:04

Dim L as Long

Поэтому L по любому будет целым... И при присваивании
Код: Выделить всё
L=36.6
L сразу же округляется до 37. А Int(36.6) возвращает целую часть числа, т.е. 36...

Понятно?
Последний раз редактировалось Amed 21.02.2005 (Пн) 0:19, всего редактировалось 1 раз.

artyuha
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 07.09.2004 (Вт) 3:47

Сообщение artyuha » 21.02.2005 (Пн) 0:17

:oops: Плуганул. Понятно

artyuha
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 07.09.2004 (Вт) 3:47

Сообщение artyuha » 21.02.2005 (Пн) 0:46

Тут Amed писал:

byte1 = sum \ 255 \ 255 \ 255

разве это не будет равнозначно

byte1 = sum * 255 \ 255^2

, как это бы соответствывало при преобразовании 4-х этажной дроби (в математике) :roll:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.02.2005 (Пн) 0:47

Это не четырёхэтажная дробь получается, а

byte1 = sum \ (255& * 255& * 255&)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.02.2005 (Пн) 9:07

Эх, опять опоздал :)
А нельзя однобайтные объявить как массив и воспользоваться CopyMemory? И проще и быстрее.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.02.2005 (Пн) 11:36

Да, да! :)
Давайте ещё byte safearray создадим на основе long! :)

А ещё есть LSet - тоже ага! :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.02.2005 (Пн) 11:38

LSet не покатит, разве что создавать промежуточные Integer :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.02.2005 (Пн) 11:50

:)
Код: Выделить всё
Option Explicit

Private Type l
  l As Long
End Type

Private Type b
  a As Byte
  b As Byte
  c As Byte
  d As Byte
End Type

Private Sub Form_Load()
  Dim l As l, b As b
 
  l.l = &H12345678
  LSet b = l
 
  MsgBox Hex$(b.d) & "-" & Hex$(b.c) & "-" & Hex$(b.b) & "-" & Hex$(b.a)
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.02.2005 (Пн) 11:57

Э... А... Ну да :)
Я что-то перепутал наоборот, в Long вписать Byte.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.02.2005 (Пн) 12:30

:)
Код: Выделить всё
Option Explicit

Private Type l
  l As Long
End Type

Private Type b
  a As Byte
  b As Byte
  c As Byte
  d As Byte
End Type

Private Sub Form_Load()
  Dim l As l, b As b
 
  b.a = &H78
  b.b = &H56
  b.c = &H34
  b.d = &H12
 
  LSet l = b
 
  MsgBox Hex$(l.l)
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.02.2005 (Пн) 12:41

Все, молчу, молчу... :)
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.02.2005 (Пн) 12:59

Что-то вы накрутили - ведь тут все дюже просто:

Код: Выделить всё
    Dim m(3) As Byte, a As Long
   
    a = &H343E45CA
    CopyMemory m(0), a, 4
    Debug.Print Hex(m(3)), Hex(m(2)), Hex(m(1)), Hex(m(0))


И только-то... ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.02.2005 (Пн) 18:16

Утверждается, что это медленнее, чем делением.
Изображение

artyuha
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 07.09.2004 (Вт) 3:47

Сообщение artyuha » 22.02.2005 (Вт) 1:55

Кажыся раздуплился как делением. Кому интересно вышл код у меня такого плана:

Dim byte1 As Byte, byte2 As Byte, byte3 As Byte, byte4 As Byte
Dim sum As Long, f As Long

sum = -2000000056

If sum >= 0 Then
byte1 = sum \ 256 ^ 3
byte2 = (sum - byte1 * 256 ^ 3) \ 256 ^ 2
byte3 = (sum - byte1 * 256 ^ 3 - byte2 * 256 ^ 2) \ 256
f = byte3
byte4 = sum - byte1 * 256 ^ 3 - byte2 * 256 ^ 2 - 256 * f
Else
sum = Abs(sum) - 1
byte1 = sum \ 256 ^ 3
byte2 = (sum - byte1 * 256 ^ 3) \ 256 ^ 2
byte3 = (sum - byte1 * 256 ^ 3 - byte2 * 256 ^ 2) \ 256
f = byte3
byte4 = sum - byte1 * 256 ^ 3 - byte2 * 256 ^ 2 - 256 * f

byte1 = 255 - byte1
byte2 = 255 - byte2
byte3 = 255 - byte3
byte4 = 255 - byte4
End If

MsgBox byte1 & ":" & byte2 & ":" & byte3 & ":" & byte4

Накручен, но всё вроде работает.
Проверял кодом другого плана :

Dim L As Long
Dim Fileno As Byte
Dim byte1 As Byte, byte2 As Byte, byte3 As Byte, byte4 As Byte

L = -2000000056
Fileno = FreeFile

Open App.Path & "\1.ini" For Output As Fileno
Close Fileno

Open App.Path & "\1.ini" For Binary As Fileno
Put #Fileno, , L

Get #Fileno, 1, byte1
Get #Fileno, 2, byte2
Get #Fileno, 3, byte3
Get #Fileno, 4, byte4
Close Fileno

MsgBox byte4 & ":" & byte3 & ":" & byte2 & ":" & byte1

ТОЖЕ ТАК НИЧЁ :)

Спасибо за “\”

Только у меня возник ещё один вопрос. Почему byte1 * 256 ^ 3 работает отлично, а 256 * byte3 выдаёт ошибку переполнения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.02.2005 (Вт) 3:56

Потому что пиши 256& вместо 256, и будет тебе Щастье.
Изображение


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

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 140

    TopList  
cron