Георгий Овечкин
36 уровень
Побитовые операции - поиск следующего числа, похожего на маску
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергеев ВикторMaster
24 марта 2018, 23:06
Маска тут не подходит, можно конечно извращаться, но зачем? ради экономии нескольких байт?
Маску накладывают на входящее значение и если получают 1 значит true иначе false.
В вашем примере если наложить
0110 0110 0100 0001
на
0000 0000 1000 0010
то получим все false и не понятно что дальше делать.
0
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 20:27
пример чисел и маски можно?
+1
Георгий Овечкин
23 марта 2018, 21:10
Вот на этом месте я сломался. Похоже, вопрос нужно ставить несколько по-другому.
Есть некоторая маска - месяц, день, час когда "можно". Типа "3.4.5.6.7.8" - месяц, с марта по чего там восьмое. День - "1,3,6,...24,27...". Час - "1,2,3,4,5,6".
Есть дата, когда "началось". Скажем, 2018-02-28-01. Нужно найти следующую дату, когда "можно".
Моя идея превратить все это в битовое число и сравнивать. Дальше "магия, вжух" и получилось следующее число.
P.S. Тут, пока ответ писал, пришла идея. Превращать каждый интервал отдельно в битовое и просто сдвигать....
0
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 22:43
яннп :)
я просил два числа и маску.
входное число
маску
следующее подходящее число
ну или объясните что вы пытаетесь реализовать? может это можно сделать как-то проще?
0
Георгий Овечкин
24 марта 2018, 06:37
Окей. Числа следующие:
Маска:
0110 0110 0100 0001
Число:
0000 0000 1000 0010
Следующее число, которое подойдет к этой маске, будет:
0000 0010 0000 0000
0
Стас Пасинков Software Developer в Zipy Master
24 марта 2018, 11:06
если использовать ту формулу, что вы предложили число ^ маска = маска, то она тут не работает...
0000 0000 1000 0010 (число1)
0110 0110 0100 0001 (маска)
0110 0110 1100 0011 (результат, который отличается от маски)
0000 0010 0000 0000 (число2)
0110 0110 0100 0001 (маска)
0110 0100 0100 0001 (результат, который отличается от маски)
как видите, отличаются от маски как-раз те разряды, которые в исходном числе были не нулевыми. это происходит из-за того, что свойства оператора ^ таковы, что по той вашей формуле число ^ маска = маска, единственное число, которое удовлетворяло бы такому условию - будет 0
0
Стас Пасинков Software Developer в Zipy Master
24 марта 2018, 11:36
в сетях используется обычно побитовое и: &
в первом же примере на вики можно увидеть как оно работает
вот там, для поиска следующего подходящего числа мы меняем самый "правый" нолик, которому соответствует ноль в маске - на единицу :)
то-есть, при
0000 0000 1000 0010 (число1)
0110 0110 0100 0001 (маска)
самый "правый" разряд, в котором и в числе, и в маске стоит 0 - это третий разряд. соответственно, его и стоит сделать 1 в исходном числе.
но это сработает с побитовым и. с исключающим или - к сожалению, нет
да и задача, судя по всему, у вас не такая, как найти следующий ip-адрес в сети, используя маску подсети)
0