Что нового

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

vovsla

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

xXx

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

InnI

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

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

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

vovsla

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

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
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

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

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
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)
 
Верх