Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Где почтить по битовые операции в VB / 11 сообщений из 11, страница 1 из 1
29.09.2003, 10:27
    #32277874
oops1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
Немогу ничего найти про битовые операции в VB (всякие тим сдвиги наложения масок). Не подскажите где можно про них почитать
...
Рейтинг: 0 / 0
29.09.2003, 10:57
    #32277929
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
Может тебе поможет Logical/Bitwise Operators ?
...
Рейтинг: 0 / 0
29.09.2003, 11:05
    #32277946
oops1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
спасибо, конечно. Но я пытаюсь найти операцию аналогичной СИ-шной "<<" или ">>". (Обычный побитовый сдвиг). Немогу найти ничего подобного :-(
...
Рейтинг: 0 / 0
29.09.2003, 11:46
    #32278025
oops1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
ситуация усугубляется тем, что я использую VB-6. В net-е это опареции обчного сдвига как в Си >> и <<. А в шестом ничего подобного нет
...
Рейтинг: 0 / 0
29.09.2003, 13:30
    #32278223
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
Предлагают такое решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Public Function LShiftLong(ByVal Value As Long, _
    ByVal Shift As Integer) As Long
  
    MakeOnBits
  
    If (Value And ( 2  ^ ( 31  - Shift))) Then GoTo OverFlow
  
    LShiftLong = ((Value And OnBits( 31  - Shift)) * ( 2  ^ Shift))
  
    Exit Function

OverFlow:
  
    LShiftLong = ((Value And OnBits( 31  - (Shift +  1 ))) * _
       ( 2  ^ (Shift))) Or &H80000000
  
End Function

Public Function RShiftLong(ByVal Value As Long, _
   ByVal Shift As Integer) As Long
    Dim hi As Long
    MakeOnBits
    If (Value And &H80000000) Then hi = &H40000000
  
    RShiftLong = (Value And &H7FFFFFFE) \ ( 2  ^ Shift)
    RShiftLong = (RShiftLong Or (hi \ ( 2  ^ (Shift -  1 ))))  
End Function
 


Private Sub MakeOnBits()
    Dim j As Integer, _
        v As Long
  
    For j =  0  To  30 
  
        v = v + ( 2  ^ j)
        OnBits(j) = v
  
    Next j
  
    OnBits(j) = v + &H80000000
End Sub
...
Рейтинг: 0 / 0
29.09.2003, 14:03
    #32278294
oops1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
Спасибо огромное!!! Очень выручили!!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
01.04.2009, 20:18
    #35906810
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
Продолжу вопрос:
Пример, конечно, замечательный. Но это называется "вывернуться".
Т.е. в то время, как в C++ или в VB.NET операция побитового сдвига на одну позицию выполняется намного быстрее, чем умножение или деление на два, в данном примере такой побитовый сдвиг в критических местах программы может заметно замедлить её скорость выполнения.

Проблема в том, что я пишу программу (с радостью бы написал на C, но мне её просили в Excel'е выполнить), в которой присутствует перебор неимоверного количества комбинаций с её сложным анализом. На небольшом количестве исходных данных она перебирает 10-15 минут. Хотелось бы оптимизировать работу программы, используя вместо булевского массива только одну переменную, и применить в ней побитовый сдвиг, чтобы найти нужное в ней значение.

вопрос: всё-таки в VB есть побитовый сдвиг? или нет?
...
Рейтинг: 0 / 0
01.04.2009, 20:21
    #35906815
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
вернее даже так: мне надо узнать значение i-го бита в переменной. Вот)) как это можно сделать быстрым способом? в C я бы применил просто побитовый сдвиг к числу 1, и выполнил бы конъюнкцию (побитовую &) с получившимся числом.

В противном случае мне придётся использовать операцию возведения в степень :-(
...
Рейтинг: 0 / 0
01.04.2009, 20:25
    #35906822
Где почтить по битовые операции в VB
Charles Weyland,
можешь верить, а можешь не верить и отладчиком/дизассемблером проверить, но у VB6 и VC6 одна "неонка внутре", в смысле бэк-энда компилятора. Целочисленное умножение на константу-степень двойки транслируется (в native code) в операции сдвига.
...
Рейтинг: 0 / 0
01.04.2009, 20:40
    #35906839
Где почтить по битовые операции в VB
Charles Weylandвернее даже так: мне надо узнать значение i-го бита в переменной. Вот)) как это можно сделать быстрым способом? в C я бы применил просто побитовый сдвиг к числу 1, и выполнил бы конъюнкцию (побитовую &) с получившимся числом.

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

Только это такие блохи, что, ловя их, много вряд ли выиграешь.
...
Рейтинг: 0 / 0
02.04.2009, 00:28
    #35907055
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где почтить по битовые операции в VB
13-й кварталМассив из степеней двоек и конъюнкция.
ОО!! Свежесть Ваших мыслей меня поразила!! (реально поразила! Может, кто-то иначе считает, но мне всё равно)) )
Спасибо за идею!!!!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Где почтить по битовые операции в VB / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]