Циклический сдвиг на n бит

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

Циклический сдвиг на n бит

Сообщение Sun07 » 21.09.2006 (Чт) 0:10

Скажите пожалуйста, какие в VB есть функции циклического сдвига на n бит значения переменной вправо или влево? Надо сдвинуть биты в байтовой переменной.

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

Сообщение GSerg » 21.09.2006 (Чт) 0:11

Первый топик в Кирпичах об этом, мой внимательный друг...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 21.09.2006 (Чт) 1:13

Мда, я ничего не понял там. И комментариев нет. Пришлось опять самому:
Код: Выделить всё
Public Function RotateRightByte(b As Byte, nBit As Byte) As Byte
    Dim i As Byte
    if nbit=0 then 10
    For i = 1 To nBit
    b = Fix(b / 2) + (b Mod 2) * &H80
    Next
10   RotateRightByte = b
End Function

Самое интересное, что здесь можно циклически сдвинуть байт на 200 бит :)

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

Сообщение GSerg » 21.09.2006 (Чт) 1:22

Ты не понял, как вызвать одну функцию с тремя параметрами, чьи имена говорят сами за себя? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 21.09.2006 (Чт) 2:47

там куча функций с кучами параметров. Надо было написать, что каждая функция делает. Например, я понял, что там есть функция для вылеления, скажем, из Long старшего и младшего слова. Но, глядя на код, мне проще написать свой, чем понять представленный. Я не люблю использовать код, не разобравшись. Да и как не разобравшись можно его использовать? Циклический сдвиг я так и не нашёл, и не понял, где он делается (хотя я тщательно не разбирался, да и некоторые моменты мне совсем непонятны). Короче, это код НЕ ДЛЯ НОВИЧКА (хоть я уже и не новичёк, но понять с ходу что делается в строке "DWORD = (High And &H7FFF) * &H10000 Or &H80000000 Or Low" с точки зрения логики я не могу (может, я неправильно понял назначение функции?)

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

Сообщение alibek » 21.09.2006 (Чт) 7:50

word AND &h7FFF - выделить все биты слова, кроме старшего (15-го бита).
word * &h10000 - сдвинуть бита на 16 разрядов влево.
dword OR &h80000000 - установить старший бит двойного слова (31-ый бит).
high*&h10000 OR low - из двух слов (high и low) собрать двойное слово, high будет верхним словом, low будет нижним словом.
Lasciate ogni speranza, voi ch'entrate.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 21.09.2006 (Чт) 10:32

понятно, значит это ф-я сцеления двух слов в двойное. Интересно, а зачем снимать старший бит перед сдвигом, а потом снова его устанавливать? Вроде старший бит не теряется при сдвиге и отрицательные числа умножаются нормально.

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

Сообщение GSerg » 21.09.2006 (Чт) 10:33

До сдвига оно было положительным, что и вызовет переполнение при умножении.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 21.09.2006 (Чт) 10:53

не, если старший бит установлен - это отрицательное число. Никакого переполнения не будет:
Код: Выделить всё
Private Sub Form_Load()
Dim a As Integer, b As Long
a = &HFFFF
MsgBox a
b = a * &H10000
c = &HFFFF0000
MsgBox b & " = " & c
End
End Sub

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

Сообщение alibek » 21.09.2006 (Чт) 12:44

Зато &H10000 - Long и результат приводится к Long.
Умножь на &h0FFF.
Lasciate ogni speranza, voi ch'entrate.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 21.09.2006 (Чт) 22:29

Alibek, мы же сдвигаем на 16 бит и результат ДОЛЖЕН быть Long. Если умножить на &h0FFF - понятно, что переполнение. А зачем, спрашивается, нам умножать на &h0FFF?

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

Сообщение GSerg » 21.09.2006 (Чт) 22:58

Это в WORD оно нужно, поскольку байт беззнаковый.
Во-вторых, в MSDN вот так...
И в-третьих, мне кажется, когда-то я собирался передавать туда "типа unsigned short" в виде лонгов, где была бы нужна такая фишка.

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


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 13

    TopList