Работа с битами в VB60...

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

Работа с битами в VB60...

Сообщение Rojohn » 12.07.2007 (Чт) 10:07

Здравствуйте, уважаемые!
Подскажите пожалуйста, как в VB60 получить значение определенных битов определенного байта? Например, с порта LPT приходит значение типа Byte, состоящее из 2-х байт. Нужно получить значение первых 3-х битов второго байта. И как записать в переменную Byte те же биты во второй байт? Видел пример в кирпичах (автор GSerg), но он не полностью отвечает на мои вопросы и не всё там понятно для меня. Наверняка всё делается просто путем простых логических операций, но как?
Спасибо!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

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

Оператором AND.
Первые 3 бита -- and &h7.
Первые 3 бита второго байта -- and &h700.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 12.07.2007 (Чт) 10:44

То есть мне надо сначала перевести число в битовый формат и оно должно быть не более 3-х битов, а потом прибавить &h7 или &h700? А что это прибавление означает, побитовый сдвиг или дополнение до байта? Наверное, скорее всего первое?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 12.07.2007 (Чт) 10:54

оно должно быть не более 3-х битов
Нет.
Просто 7 = 111 в бинарном виде.
Советую просто поэксперементировать с разными значениями и ДАО само придет... :)
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

:)

Сообщение Rojohn » 12.07.2007 (Чт) 11:01

Хорошо! Так и сделаю:) Большое спасибо всем!!!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Re: ?

Сообщение tyomitch » 12.07.2007 (Чт) 12:45

Rojohn писал(а):То есть мне надо сначала перевести число в битовый формат

Не надо. Число уже в нём. И в другом формате внутри компа не бывает.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 12.07.2007 (Чт) 13:40

Нее... я имел ввиду если мне надо поместить команду "1" в первые 3 бита второго байта переменной типа Byte, то мне нужно писать что-то типа:
Код: Выделить всё
          Dim vByte As Byte, vStr as String
         
          vStr="001"
          vByte=CByte(vStr) and &H007


Или я что-то путаю?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 13:49

Путаешь.
Вернее ты вообще не понял сути того, что тебе говорили.

Фраза же "второй байт переменной типа Byte" вообще мне непонятна.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 12.07.2007 (Чт) 13:55

А сколько байт может хранится в переменной типа Byte? Мне кажется 0-255, значит два байта там как минимум должно быть (0 и 1) и у каждого по 8 бит или я че-то не так понимаю?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 13:59

OMG...

В переменной типа Byte хранится значение Byte -- один байт.
Так же, как в переменной типа Integer хранится два байта, а в переменной типа Long хранится четыре байта.
Rojohn, тебе нужно срочно в школу, в седьмой или восьмой класс, где проходят системы исчисления, отличные от десятичных.
Составь (самостоятельно, а не подсмотрев в инете или учебниках) таблица соответствий двоичных и десятичных чисел от 0 до 15 и понимание к тебе придет.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

???

Сообщение Rojohn » 12.07.2007 (Чт) 14:05

Alibek ты прав, эти системы счисления я проходил именно где-то в 7-8 классе, поэтому уже почти всё забыл. Хотя тут проблема скорее в соотношении систем счисления типам данных VB60. Полноценного руководства по этому я не нашел, поэтому кое-чаго не допонял.
Но, если 2 байта возможны только в Integer, то как мне передать на LPT два байта, где во втором первые 3 бита будут = числу 1? Последовательно чтоли, байт за байтом? Или просто написать 1 в переменную типа Integer и при отправке на LPT прибавить and &H700?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 14:37

Какое еще соотношение систем исчисление?
На VB оно стандартное, IEEE-какой-то, также, как и в 99% всех остальных программ.

Если тебе нужно в двухбайтовом слове установить или сбросить определенные биты, то используешь логические операторы AND или OR. Установить Value Or Mask, сбросить Value And Mask (или Value And Not Mask), в Mask будут эти твои биты. Не знаю, зачем тебе &h700, ты вроде говорил, про три младших бита. &h700 это будут биты 8...10 (младшие биты старшего байта).
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 12.07.2007 (Чт) 14:40

Кажется начинаю допирать где собака порылась:)
Судя по всему мне надо не число 1 передавать в первых 3-х битах, а значения первых трёх битов должны быть равны 001. Т.е. для решения этой задачки мне надо знать, как прочитать битовое представление присланного (или отправляемого) байта(ов). Как это сделать? Как из байта получить строковое или числовое значение, равное двоичной записи этого байта и наоборот?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 14:42

Составь таблицу для десятичных и двоичных чисел от 0 до 255 (или хотя бы 15). Смотри по ней. Строковое двоичное представление тебе не нужно.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

!

Сообщение Rojohn » 12.07.2007 (Чт) 14:44

Во! То, что надо! Спасибо! Только ещё можно уточнить: Value может быть только 1 или 0, а Mask - это место положения бита (например &H7)? Хотя скорее не так: наверное в Value находится число, дающее определенное бинарное представление, которым мы занимаем биты, указанные в Mask. Так?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 14:52

OMG дубль два.

Value и Mask -- это числа. Например Long. Первое -- это исходное значение (число), второе -- маска битов, которые тебе нужно установить или сбросить. Результатом будет число с установленными или сброшенными битами.

Переведи Value в двоичный вид. Переведи Mask в двоичный вид. Напиши на бумажке двоичное Mask под двоичным Value, выровняв числа по правому краю.
Повторяй до появления понимания.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 12.07.2007 (Чт) 15:13

Т.е., если я правильно понял, то мы меняем исходное чило, записанное в переменной, меняя некоторые из его битов по маске?
Например:

00001000 (Value=8 )
00000111 (Mask=&H7)
_________________________
00001111 (новое число 15)

P.s.: запутался совсем, уж простите...
Последний раз редактировалось Rojohn 12.07.2007 (Чт) 15:28, всего редактировалось 2 раз(а).
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 15:21

Да. 8 Or 7 = 15.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 12.07.2007 (Чт) 15:32

Получается, что or - сложение, а and - умножение двоичных чисел???
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Re: ?

Сообщение tyomitch » 12.07.2007 (Чт) 15:36

Rojohn писал(а):Получается, что or - сложение, а and - умножение двоичных чисел???

Воистину.
Изображение

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

Re: ?

Сообщение alibek » 12.07.2007 (Чт) 15:47

Rojohn писал(а):Получается, что or - сложение, а and - умножение двоичных чисел???

Сложение -- Xor, в Or разряды не переносятся.
Сравни: 7 Or 7 и 7 + 7.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

!

Сообщение Rojohn » 12.07.2007 (Чт) 15:47

Хех! Дык тогда с ентого и надо было начинать:) Теперь вроде ясно с отправкой значения, а как перевести полученное число в бинарное представление, чтобы определенные его биты загнать в текстовую переменную? Т.е. из числа 14 (00001110) получить, например "111"?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 15:50

Зачем тебе текстовое двоичное представление числа?
Проверяешь бит номер n, если установлен, то в текстовый аккумулятор пишешь 1, иначе 0.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 12.07.2007 (Чт) 15:56

А как это проверить (n-й бит байта)? И ещё, может какую ссылочку на место, где всё это рассталковывается дадите, чтобы вас тут не напрягать?
Или просто объясните, что происходит с каждым из битов в or и and, складываются они (в моем примере), ещё что-нить делают? А то тут ещё столько разновидностей, какая-то алгебра логики пряма :)
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 12.07.2007 (Чт) 16:17

Это алгебра и есть.
If (Value And &h08) <> 0 Then MsgBox "Бит 3 установлен"
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

:)

Сообщение Rojohn » 12.07.2007 (Чт) 16:35

Я вот тоже думал так написать, потом подумал, что &h08 - это не один бит, а целая маска битов. И если мы так напишем, то мы будем проверять не n-й бит (бит 3 установлен), а всю группу битов сразу и надо будет писать не 1 в стринг, а просто считать, что число Value присутствует на месте Mask (т.к. логическое умножение Value на Mask не дало 0). Так?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 12.07.2007 (Чт) 16:45

Еще раз напиши себе на бумажке соответствия битов и чисел.. 8 - это третий бит, если считать с нуля.
label:
cli
jmp label

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 12.07.2007 (Чт) 16:58

Да знаю я уже, что он 3-й, но записывается-то он как 00001000, т.е. логическое умножение будет, например:
11111110
*
00001000
__________
00001000

Т.е. получается надо умножать на такие числа, чтобы 1*1=1. Ладно, вроде понял! Спасибо всем! Буду пробовать на практике...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 12.07.2007 (Чт) 23:22

По-моему тут кто-то что-то напутал..

Поставить 4й бит:
11101011
OR
00010000
________
11111011

Снять 3й бит:
11101011
AND NOT
00001000
(или
AND
11110111)
________
11100011
Последний раз редактировалось iGrok 13.07.2007 (Пт) 0:17, всего редактировалось 1 раз.
label:
cli
jmp label

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

Сообщение tyomitch » 13.07.2007 (Пт) 0:09

iGrok, биты нумеруются с нуля.
Изображение

След.

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

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

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

    TopList