JavaRush/Java блог/Random/Побитовые операции - поиск следующего числа, похожего на ...

Побитовые операции - поиск следующего числа, похожего на маску

Статья из группы Random
участников
Всем привет! Есть входное число. Есть битовая маска. Нужно найти следующее после входного число, которое будет подобно маске (это число ^ маска = маска). Можно ли это сделать без подбора? Т.е. без цикличного инкрементирования входного числа и сравнения с маской?
Комментарии (7)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергеев Виктор
Уровень 40
Master
24 марта 2018, 23:06
Маска тут не подходит, можно конечно извращаться, но зачем? ради экономии нескольких байт? Маску накладывают на входящее значение и если получают 1 значит true иначе false. В вашем примере если наложить 0110 0110 0100 0001 на 0000 0000 1000 0010 то получим все false и не понятно что дальше делать.
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 20:27
пример чисел и маски можно?
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. Тут, пока ответ писал, пришла идея. Превращать каждый интервал отдельно в битовое и просто сдвигать....
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 22:43
яннп :) я просил два числа и маску. входное число маску следующее подходящее число ну или объясните что вы пытаетесь реализовать? может это можно сделать как-то проще?
24 марта 2018, 06:37
Окей. Числа следующие: Маска: 0110 0110 0100 0001 Число: 0000 0000 1000 0010 Следующее число, которое подойдет к этой маске, будет: 0000 0010 0000 0000
Стас Пасинков 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
Стас Пасинков Software Developer в Zipy Master
24 марта 2018, 11:36
в сетях используется обычно побитовое и: & в первом же примере на вики можно увидеть как оно работает вот там, для поиска следующего подходящего числа мы меняем самый "правый" нолик, которому соответствует ноль в маске - на единицу :) то-есть, при 0000 0000 1000 0010 (число1) 0110 0110 0100 0001 (маска) самый "правый" разряд, в котором и в числе, и в маске стоит 0 - это третий разряд. соответственно, его и стоит сделать 1 в исходном числе. но это сработает с побитовым и. с исключающим или - к сожалению, нет да и задача, судя по всему, у вас не такая, как найти следующий ip-адрес в сети, используя маску подсети)