Страницы: 1
RSS
Оператор AND и преобразование типа, 10 AND 4 =0??
 
Мяв
Практически никогда не использую AND, а тут вдруг случилось.
И неожиданно всплыло, что строка
Код
Len(Me.TextBox5) And Len(Me.ComboBox1)

работает совершенно не так, как от нее ожидается.
Результаты теста такой конструкции в файле.
Вопрос - как это работает?
 
RAN, Андрей, а что хотелось получить? ибо сейчас идет побитное сравнение
например 10 и 2  (1010 и 0010 ) = 0010 = 2

P.S. Иногда прям расту в своих глазах, не занимаясь этим (макросы это не мое) , я это знаю :-)
Изменено: БМВ - 29.01.2019 12:19:08
По вопросам из тем форума, личку не читаю.
 
Хотелось результат, который выдает функция И().
Это просто проверка двух условий в If.
Код
If Len(Me.TextBox5) And Len(Me.ComboBox1) Then

Рабочий вариант
Код
If Len(Me.TextBox5) Then
If Len(Me.ComboBox1) Then
Изменено: RAN - 29.01.2019 12:23:34
 
А что не так? Это вроде логический оператор, могу предположить, что складывать числовые значения этот оператор не умеет.  :D
что должна показывать функция в итоге?
Изменено: Nordheim - 29.01.2019 12:27:33
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
БМВ написал: идет побитное сравнение
Вот же интересно! Логическое И. Но там, где не ожидаешь...

Цитата
Nordheim написал: могу предположить, что складывать числовые значения этот оператор не умеет.
Да, но то, что оператор в данном случае сравнивает двоичные числа?
То ли не знал, то ли не знал, и забыл :)
 
Андрей, у функции листа все что не 0 и не ошибка то истина, как резултат передали 10 и 2 получили истину или 1  математически abs(sign(10*2))
В vba False  это 0 а вот True  это  -1  :-) не надо спрашивать где логика можно просто посмотреть на результат test1 = CBool(Len(r1.Text)) And CBool(Len(r2.Text))
соответcтвенно или test1 = Sgn(Len(r1.Text)) And Sgn(Len(r2.Text)) или test1 = Len(r1.Text)>0 And Len(r2.Text)>0  или все что угодно, но приравнять надо к одному биту.

или тип менять
Код
Function test1(r1 As Range, r2 As Range) As Boolean
test1 = CBool(Len(r1.Text)) And CBool(Len(r2.Text))
End Function
Изменено: БМВ - 29.01.2019 12:30:31
По вопросам из тем форума, личку не читаю.
 
Как всегда, классические разъяснения у Владимира (ZVI).
Изменено: sokol92 - 29.01.2019 12:29:21
Владимир
 
Цитата
vikttur написал:
Да, но то, что оператор сравнения в данном случае сравнивает двоичные числа?
Парни вы чего? Я что один из-за админства с битами работаю???? В ActiveDirectory то и дело приходится сравнивать. AND это по сути умножение побитное
например 10 AND 10 = 10
1010
1010
-----
1010 = 10
, а 10 AND 9 = 8
1010
1001
-----
1000 = 8
. все логично.
По вопросам из тем форума, личку не читаю.
 
Да с двоичной арифметикой проблем нет. Параллель не провел, не подумал, что оператор VBA AND превращается в двоичное И :)

Я редко AND применяю. Разношу обычно на If/If
 
Кажется стало прояснятся
Самое главное, что я упустил, преобразование типа происходит однократно, после срабатывания оператора AND внутри условия.
Нет, в две строчки работать проще!
Всем спасибо.

PS Владимир, как удается откапывать такие темы?
PPS
Цитата
БМВ написал:
Я что один из-за админства с битами работаю????
А я так вообще не знаю, что это такое.
Изменено: RAN - 29.01.2019 12:47:43
 
Цитата
RAN написал: If Len(Me.TextBox5) And Len(Me.ComboBox1) Then
Цитата
БМВ написал: CBool(Len(r1.Text)) And CBool(Len(r2.Text))
Извращенцы, блин :)  Огород городить, лишь бы логические выражения не писать
Код
If Len(Me.TextBox5) > 0 And Len(Me.ComboBox1) > 0 Then
 
Цитата
Андрей VG написал:
Извращенцы, блин   Огород городить
попрошу не обобщать :-)
Цитата
БМВ написал:
или test1 = Len(r1.Text)>0 And Len(r2.Text)>0  или
По вопросам из тем форума, личку не читаю.
 
Цитата
RAN написал:
Владимир, как удается откапывать такие темы
Я являюсь "фанатом" творчества ZVI (Андрей и Михаил подтвердят). На мой взгляд, уровень знаний Владимира и качество подачи материала находятся на высшем мировом уровне.
Изменено: sokol92 - 29.01.2019 13:41:45
Владимир
 
Цитата
БМВ написал:
Иногда прям расту в своих глазах, не занимаясь этим (макросы это не мое)
Скромничаете) Это "не моё" на голову выше моего знания по ряду направлений)
Насколько я помню ассемблер и всязанные с ним побитовые операции - AND - это битовая маска, которая после ее наложения оставляет только то, что совпало с 1 в разряде.
 
забыл

И - логическое умножение:
0*0=0
1*0=0
1*1=1

Или - логическое сложение:
0+0=0
1+0=1
1+1=1
Изменено: wowick - 29.01.2019 13:53:43
Если автоматизировать бардак, то получится автоматизированный бардак.
 
Цитата
Андрей VG написал:
Огород городить, лишь бы логические выражения не писать
Это всё идет от создателя языка "С". Фанатичное стремление к минимизации числа символов текста программы дорого обошлось для развития программирования (при этом С (разумеется, наряду с VBA)  - мой любимый язык).
Изменено: sokol92 - 29.01.2019 14:06:44
Владимир
 
с одной стороны это стандартные "вольности" VB, но если это описано в документации - это не ошибка это особенности реализации языка
когда логические операторы можно использовать для нелогических операндов
в окне immediate:
? 4 and 2
результат: 0
? 4 and 4
результат: 4
? 4 or 4
результат: 4
? 4 or 2
результат: 6
потому что
4 это 100, а
2 это 010 в двоичной системе
и для AND нужны 1 в определеноммном разряде во всех операндах, а для OR хотя бы в одном из них.
(и для любознательных 5 Or 3 в результате будет 7 (если Вам показалось что 4 or 2 в результате это 6 и эти операции я легко могу делать в уме)
 
я практикую побитовое операции
когда вместо 32 Boolean переменных, можно обьявить 1 Long, тогда можно управлять (проверять) наличие/отсутсвие каждого бита отдельно
все, кому доводилось написать маску сети в настройках сетевого оборудования сталкивались с этим в реальной практике
Изменено: Ігор Гончаренко - 29.01.2019 14:20:46
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добрый день.
Цитата
sokol92 написал:
Фанатичное стремление к минимизации числа символов текста программы дорого обошлось для развития программирования
Полностью согласен. Сейчас народ с переходом на Javascript v6 активно хвалится у кого редактор лучше синтаксис подсвечивает, чтобы увидеть где кончается одна лямбда-функция, а где другая, и какая в какую вложена :)  - то ещё счастье читать такой код.
Цитата
Ігор Гончаренко написал:
это не ошибка это особенности реализации языка
Игорь, только вот гуру настоятельно рекомендуют не писать в таком стиле.
Изменено: Андрей VG - 29.01.2019 14:24:38
 
Off 1
Цитата
sokol92 написал: уровень знаний Владимира и качество подачи материала находятся на высшем мировом уровне.
К этому нужно добавить терпимость и готовность ответить, даже на дурной вопрос, что особо ценно.
Совпало что  "юбилей".


Off 2
Цитата
БМВ написал: (макросы это не мое)
просто ленивый я, а в макросах много буковок, в результате использую только там, где без оного нельзя.

Off 3 не думаю что много свободного времени у всех, тут просто посмотрел тестовый ЕГЭ по информатике, решать все не стал, просто пробежался, кое что быстро решив, кое что было понятно как, а были и вызывающие затруднения. Одним словом  - советую сравнить себя с выпускником :-)
По вопросам из тем форума, личку не читаю.
 
Эх, нет доступа. Поменял бы кое-что в профиле Владимира:
Баллов = Собщений & ""+ Баллов = 40 000
Это не циклическая ссылка, прием из VBA :)
 
Цитата
Ігор Гончаренко написал:
все, кому доводилось написать маску сети в настройках сетевого оборудования сталкивались с этим в реальной практике
но не каждый задумался что есть эта маска и что означает например  /24 :-)
По вопросам из тем форума, личку не читаю.
 
Андрей VG,
я пишу для себя, так как мне удобно, а гуру пусть пишут как принято у них.
пару дней назад публиковал тут свою ПРОПИС, она написана более 10 лет назад, там масса битовых операций
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх