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

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

Сообщение iGrok » 13.07.2007 (Пт) 0:17

Ну хорошо =)
Забылся маленько.. После полудня экспериментов с печатью штрихкодов как-то в голове немного сумбурно =)
label:
cli
jmp label

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

?

Сообщение Rojohn » 13.07.2007 (Пт) 9:01

Если в OR происходит сложение, в AND - умножение, не совсем понятно, какое действие происходит в AND NOT? Судя по примеру перед умножением происходит инвертирование второго множителя. Я прав?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение tyomitch » 13.07.2007 (Пт) 9:25

Прав.
Изображение

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

:)

Сообщение Rojohn » 13.07.2007 (Пт) 9:45

Спасибки Тёмыч! Слышать это от тебя особенно приятно :D Кстати, открою тайну: меня тоже Тёмыч зовут :wink:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

bodja
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.04.2006 (Вс) 15:18
Откуда: Ukraina

Сообщение bodja » 13.07.2007 (Пт) 22:08

Всегда можно найти простое решение :)

Код: Выделить всё
If CBool(X And 2 ^ Y) = True Then ...


X-число
Y-номер бита (0...7)

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

Сообщение iGrok » 13.07.2007 (Пт) 23:16

И что? Это проверка состояния. Вопрос шел об установке/снятии бита.
label:
cli
jmp label

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

Сообщение tyomitch » 14.07.2007 (Сб) 0:05

сравнение булевского значения с True -- чудовищная тупость.

Предлагаю, для разнообразия, следущий код:

If ((CBool(X And 2 ^ Y) = True) = True) = True Then ...
Изображение

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

Сообщение alibek » 14.07.2007 (Сб) 0:17

Ну почему-же, я иногда булевы переменные сравниваю на True или False, когда хочу, чтобы код выглядел единообразно и формально.
Другое дело, что неправильно сравнивать логическое выражение с True. Его надо сранивать на равенство/неравенство либо с нулем, либо с битовой маской, это будет правильнее.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 14.07.2007 (Сб) 0:22

а можно на сишный манер написать

If X And 2 ^ Y Then ...

и работать будет один-в-один так же ;-)
Изображение

bodja
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.04.2006 (Вс) 15:18
Откуда: Ukraina

Сообщение bodja » 22.07.2007 (Вс) 1:33

iGrok писал(а):И что? Это проверка состояния. Вопрос шел об установке/снятии бита.


Поставить
If Dialog1.Check1.Value = 1 Then x = x + 2 ^ y

Снять
If Dialog1.Check1.Value = 0 Then x = x - 2 ^ y

Таже тема

сравнение булевского значения с True -- чудовищная тупость


Может быть ,я ориентируюсь на подсказках редактора.

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

Сообщение tyomitch » 22.07.2007 (Вс) 7:05

Редактор не подсказывает тебе сравнивать булевское значение с True.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.07.2007 (Вс) 7:39

tyomitch
Кстати, я проводил измерения, и результаты были таковыми, что переменные некоторых типов лучше всё таки сравнивать с True, ибо работал быстрее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 22.07.2007 (Вс) 11:01

Это каких таких типов? Строковые? :-)
Изображение

bodja
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.04.2006 (Вс) 15:18
Откуда: Ukraina

Сообщение bodja » 22.07.2007 (Вс) 21:46

tyomitch писал(а):Редактор не подсказывает тебе сравнивать булевское значение с True.


Смотрим картинку
Вложения
Capture_2.jpg
Capture_2.jpg (6.27 Кб) Просмотров: 497

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

Сообщение tyomitch » 22.07.2007 (Вс) 22:02

Знак равенства тоже за тебя редактор напечатал? ;-)
Не печатай знак равенства, и никто тебя не будет смущать сбивающими с толку подсказками.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.07.2007 (Вс) 22:03

tyomitch
If <Boolean> Then
If <Integer> Then
If <long> Then
If <byte> Then

bodja
Он предлагает когда ты вводишь = (равно).

Нафиг ты вводишь символ равно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

bodja
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.04.2006 (Вс) 15:18
Откуда: Ukraina

Сообщение bodja » 22.07.2007 (Вс) 22:41

Хакер писал(а):tyomitch

bodja
Он предлагает когда ты вводишь = (равно).

Нафиг ты вводишь символ равно?


Нафиг TRUE ,теперь нафиг = ,что мне тогда вообще вводить :D
Да и не всегда TRUE нужно .

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

Сообщение tyomitch » 22.07.2007 (Вс) 23:06

Хакер, Byte сравнивал с True? :lol: :lol: :lol:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.07.2007 (Вс) 23:12

tyomitch
Нет. Я выяснял, что эффективнее: писать
If GetSomeResult Then ... Else ...
или
If GetSomeResult = 0 Then ... Else ...

для некоторых типов не было разницы, для некоторых - второй вариант работал быстрее.

Проверял очень давно - сейчас уже не помню, зачем и какие конкретно результаты получились.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 23.07.2007 (Пн) 1:15

Разрешите мне cунуть в эту тему свои 5 копеек.

У меня когда-то была подобная проблема.
Решил я ее примерно так:

Код: Выделить всё
Function Dec2Bin(Value) As String

Dim i, j$

i = Value

Do
If i Mod 2 = 1 Then j = "1" + j Else j = "0" + j
i = Fix(i / 2)
Loop Until i = 0

Dec2Bin = j

End Function

Function Bin2Dec(Value As String)

Dim i, j

For i = 0 To Len(Value) - 1 Step 1
If Mid(Value, i + 1, 1) = "1" Then j = j + (2 ^ (Len(Value) - 1) - i)
Next i

Bin2Dec = j

End Function


Это функции для преобразования в биты и обратно.

В общем, я использовал функцию Dec2Bin, заменял нужные мне биты при помощи функции mid, затем при помощи Bin2Dec преобразовал обратно в byte.
Последний раз редактировалось t116 23.07.2007 (Пн) 1:19, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.07.2007 (Пн) 1:18

1) Названия функций неадекватные (если говорить конкретно - они перепутаны).

2) Способ ужасен. В лучших традициях xenomorph
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 23.07.2007 (Пн) 1:23

Какой есть способ лучше? Просвети.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.07.2007 (Пн) 1:26

And, Or, Xor

И без перекодирования в String.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 23.07.2007 (Пн) 1:33

Хакер писал(а):And, Or, Xor

И без перекодирования в String.


Это-то я понял.
Я думал ты имеешь в виду преобразование Bin2Dec и Dec2Bin.

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

Сообщение tyomitch » 23.07.2007 (Пн) 9:43

t116 писал(а):
Хакер писал(а):And, Or, Xor

И без перекодирования в String.


Это-то я понял.
Я думал ты имеешь в виду преобразование Bin2Dec и Dec2Bin.

Эти преобразования никогда не нужны. Вообще никогда.
Изображение

Wildwhiteash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2007 (Чт) 17:02
Откуда: Украина, Николаев

Сообщение Wildwhiteash » 23.07.2007 (Пн) 12:13

а можно вставить свои 5 копеек? :roll:
Если с LPT нужна побитная работа то я в свое время решил так
http://www.geekhideout.com/iodll.shtml - доступ к железяке
и
Код: Выделить всё
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean

в общем вот.
Не совсем корректно в плане винды, она тупит, если лезет в то же место, но вполне работоспособно.
Хотя можно и так как выше написано, побитно раскладывать

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 24.07.2007 (Вт) 0:35

Чтобы сделать биты равными одному проще перевести число в бинарную форму, переделать и вернуть всё в байты ->

Байт Биты
0 = 000
1 = 001
2 = 010
3 = 011
4 = 100
65535 = 11111111
Я думаю домыслить ничего не стоит.
Тему перевода чисел именно по информатике мы прошли в 9-м классе

НО, это сначала и только для понимания принципа а уж после недолгих экспериментов юзать логические операции ИМХО последнее быстрее...

Мне кажется, что автор (вопроса) для решения проблемы должен твёрдо уяснить для себя что:
байт = 8бит
2 байта = слово (WORD)
4 байта = двойное слово (Double Word, DWORD)
1024 байта = 1 Килобайт КБ
1024 КБ = 1 МБ
1024 МБ = 1 ГБ
200 с копейками гигабайт = 1 терабайт (но, вроде не 1024)
1 километр = 1024 метра... ой... а может и 1000

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 25.07.2007 (Ср) 22:54

X-hacker
65535 = 11111111
а ты уверен что правильно написал, в информатике принято 1 байт(11111111) равен 255, а 65535 это 2-х байтовое число(1111111111111111)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 26.07.2007 (Чт) 7:12

X-hacker писал(а): 200 с копейками гигабайт = 1 терабайт (но, вроде не 1024)


С чего бы нет то? 1 терабайт = 1024 гигабайт, как ему по должности и положено!
Весь мир матрица, а мы в нем потоки байтов!

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

Продолжаю начатую тему

Сообщение Rojohn » 26.07.2007 (Чт) 10:17

Дамс, не думал, что мой топик окажется таким посещаемым :)
Вот в продолжение его ещё вопросик:
В обычном IF я бы написал так:
Код: Выделить всё
If (Not (LPTValue And 2 ^ 7)) Or (LPTValue And 2 ^ 6) Then

Но Not - уже является логическим оператором и сбивает само условие. Как в таком случае правильнее написать в одном IF несколько проверок на 1 и 0-е биты байтовой переменной? Т.е. надо проверить, например, стоит ли в 7-м бите 0 и в 6 - 1, не нагородив при этом лестницу из IF-ов.
Спасибо!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Пред.След.

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

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

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

    TopList