Беззнаковое целое

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Беззнаковое целое

Сообщение alibek » 01.08.2003 (Пт) 9:36

Привет, народ :)
Не подскажите ли, как организовать подобное на VB.
Имеется флаговое Long, в котором нужно отдельно устанавливать/считывать разряды. Проблема в старшем бите - значение 2^31 VB не хочет понимать, возникает Overflow (что и понятно)
Сейчас у меня сделано так (код набирал по памяти, возможны опечатки):
Код: Выделить всё
'Определение значения бита
Function CheckBit(ByVal Value As Long, ByVal Bit As Long) As Boolean
If Bit = 31 Then
  CheckBit = (Value < 0)
Else
  CheckBit = ((Value And (2^Bit)) = (2^Bit))
End If
End Function

'"Сборка" числа из битов (массив 0...31)
Function CompileBits(Bits() As Boolean) As Long
Dim I As Long, ret As Long
For I = 0 To 31
  If I = 31 Then
    If Bits(I) Then ret = ret + &h80000000
  Else
    If Bits(I) Then ret = ret Or (2^I)
  End If
Next I
CompileBits = ret
End Function


Все работает, но хотелось бы избавиться от If Bit = 31, это реально?
Я пробовал вначале прибавлять &h80000000, затем проводить логические операции, затем снова отнимать &h80000000, но что-то не то -- 2@^31 он все-равно приводит к Long и возникает переполнение, хотя результат должен уместиться в Long.
Lasciate ogni speranza, voi ch'entrate.

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 01.08.2003 (Пт) 10:08

long состоит из 4-х байт причем 1-й бит выделен под знак соответственно у тебя максимальное значение long 2^31 и больше ты туда не запишешь под страхом переполнения, а поскольку unsigned или чего подобного в васике нет (ну по крайней мере я не знаю) то тебе не судьба избавится от if ...
зы можешь попробовать создать свой тип данных может красивей получится....
Ничто так не ограничивает полёт мысли программиста, как компилятор

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

Сообщение GSerg » 02.08.2003 (Сб) 4:03

В чём проблема, alibek? :)

? 56& or (&h80000000)
-2147483592 ' это 10000000000000000000000000111000

? -2147483592 and (not &h80000000)
56 ' это 00000000000000000000000000111000
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 02.08.2003 (Сб) 11:59

Это если использовать Hex :)
Сами операции с маской разумеется работают нормально, проблема в том, чтобы получить маску, которая бы умещалась в Long.
Маска с установленным старшим разрядом это &h80000000. И для знакового Long это минус два миллиона с чем-то, хотя все остальные разряды считаются простым 2^Bit. Вот и приходится делать If Bit=31.
Впрочем, я сделал по другому. Объявил массив Power2(0 to 31) и заполняю его при запуске. И потом просто использую элементы этого массива для маски.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList