Что нового

Как определить входит ли число в перечень чисел или их сумму?

vovsla

Осваивающий
Сообщения
607
Репутация
36
В функции MsgBox значение указывающие на тип окна и возможные комбинации кнопок нужно указывать в виде числа или суммы определенных чисел.
По сути у меня очень схожая задача. Мне нужно проверить входит ли вводимое число в предопределенный ряд чисел или всевозможную комбинации сумм этих чисел.
Как это реализовать? Желательно без цикла.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Справка --> Функции пользователей --> Функции по разделам --> Обучение --> ...
Там найдете много чего интересного, в том числе и раздел "Битовый флаг".
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Битовый флаг применяется для степеней двойки.

Если число произвольное, то:
- вхождение в предопределённый ряд (в перечисление) определяется перебором
- вхождение в диапазон определяется путём сравнения с границами диапазона
- вхождение в сумму зависит от многих факторов. Например, для целых положительных чисел может зависеть от числа слагаемых:
- если слагаемых два, то число должно быть меньше суммы (число + 1)
- если слагаемых три, то число должно быть как минимум на 2 меньше суммы (число + 1 + 1)
- и т.д.

А вот узнать из каких конкретно произвольных чисел состоит сумма - нереально. Особенно, если учитывать отрицательные и дробные числа.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Отрицательные и дробные числа не нужны. По сути нужно узнать корректно ли задано число для флага MsgBox
Можно пример с использованием битового флага для степени двойки?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla [?]
По сути нужно узнать корректно ли задано число для флага MsgBox
Насколько я понимаю, если флаг задан неправильно, то сообщение не появится и возвращаемый результат будет равен нулю
Код:
$flag = 23
$id = MsgBox($flag, "", "")
If Not $id Then ConsoleWrite("Некорректный флаг: " & $flag & @CRLF)


пример с использованием битового флага для степени двойки
xXx предоставил ссылку, где в разделе "Битовый флаг", кроме подробного описания, есть и примеры. Если тех примеров мало, смотрите справку по функциям
Код:
BitOR()
BitAND()
BitXOR()
Только учтите, что в MsgBox() не все флаги являются степенью двойки. Например, 3 и 5 имеют по два установленных бита (11b и 101b соответственно). И чтобы узнать наличие этих флагов нужно в функции BitAND() получить это же число
Код:
; 5 = 101b
ConsoleWrite(BitAND(8 + 5, 5) & @CRLF) ; 13 = 1101b, результат 5 (флаг 5 установлен)
ConsoleWrite(BitAND(8 + 6, 5) & @CRLF) ; 14 = 1110b, результат 4 (флаг 5 не установлен)
ConsoleWrite(BitAND(768 + 5, 5) & @CRLF) ; 773 = 1100000101b, результат 5 (флаг 5 установлен)
Следовательно, нужно знать все допустимые флаги и "вырезать" их из суммы через BitAND.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Мне это нужно не для автоита, а для повершела. Мне нужно узнать корректность числа до его использования.
Если в MsgBox не все числа являются степенью двойки, то как автоит определяет корректность используемого числа?
И как из суммы цифр вычисляется набор слагаемых чтобы вывести требуемый MsgBox?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla
Если все флаги являются степенью двойки, то сумма всегда будет корректной. Другое дело, что некоторые флаги могут не использоваться, некоторые могут быть не совместимы и т.д. А разложить сумму на флаги можно так
Код:
$iSum = 12345

If Not $iSum Then Exit ConsoleWrite("0" & @CRLF)

For $i = 0 To 32
  $iFlag = 2 ^ $i
  If BitAND($iSum, $iFlag) Then ConsoleWrite($iFlag & " ")
Next

ConsoleWrite(@CRLF)
 
Верх