powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Где почтить по битовые операции в VB
11 сообщений из 11, страница 1 из 1
Где почтить по битовые операции в VB
    #32277874
oops1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немогу ничего найти про битовые операции в VB (всякие тим сдвиги наложения масок). Не подскажите где можно про них почитать
...
Рейтинг: 0 / 0
Где почтить по битовые операции в VB
    #32277929
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тебе поможет Logical/Bitwise Operators ?
...
Рейтинг: 0 / 0
Где почтить по битовые операции в VB
    #32277946
oops1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, конечно. Но я пытаюсь найти операцию аналогичной СИ-шной "<<" или ">>". (Обычный побитовый сдвиг). Немогу найти ничего подобного :-(
...
Рейтинг: 0 / 0
Где почтить по битовые операции в VB
    #32278025
oops1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ситуация усугубляется тем, что я использую VB-6. В net-е это опареции обчного сдвига как в Си >> и <<. А в шестом ничего подобного нет
...
Рейтинг: 0 / 0
Где почтить по битовые операции в VB
    #32278223
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагают такое решение:
Код: 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
Где почтить по битовые операции в VB
    #32278294
oops1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное!!! Очень выручили!!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Где почтить по битовые операции в VB
    #35906810
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжу вопрос:
Пример, конечно, замечательный. Но это называется "вывернуться".
Т.е. в то время, как в C++ или в VB.NET операция побитового сдвига на одну позицию выполняется намного быстрее, чем умножение или деление на два, в данном примере такой побитовый сдвиг в критических местах программы может заметно замедлить её скорость выполнения.

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

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

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

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

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


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