Viktor 
    
    
        
        
        
        теперь всё чётенько. как и должно было быть.
    
 
    
    V 
    
    
        
        
        
        сегодняшняя задача. объясните, почему (5, 7) должен дать 4? 5 & 7 == 5
    
 
    
    V 
    
    
        
        
        
        а, я понял
    
 
    
    Viktor 
    
    
        
        
        
        ух. классная задачка.
    
 
    
    Viktor 
    
    
        
        
        
        напечатался в консоли двоичное представление чисел в разных диапазонах
    
 
    
    Viktor 
    
    
        
        
        
        прежде чем увидеть прикол
    
 
    
    V 
    
    
        
        
        
        я решил в лоб с одной лишь оптимизацией — прошло
    
 
    
    Viktor 
    
    
        
        
        
        мне кажется, что я так же сделал. с той же самой оптимизацией.
    
 
    
    Viktor 
    
    
        
        
        
        скажем так, когда нуля не избежать 😂
    
 
    
    V 
    
    
        
        
        
        да)
    
 
    
    V 
    
    
        
        
        
        теперь смотрю чужие решения — там прямо огонь
    
 
    
    Evgeniy 
    
    
        
        
        
        Хорошая задача. Немного подумать пришлось
    
 
    
    Иван 
    
    
        
        
        
        Согласен, мне тоже понравилась)
    
 
    
    Иван 
    
    
        
        
        
        И не сильно обременяет и есть удовольствие от решения
    
 
    
    Evgeniy 
    
    
        
        
        
        А кто как решил? Я с помощью логарифма и сдвига
    
 
    
    Иван 
    
    
        
        
        
        Аналогично)
    
 
    
    Evgeniy 
    
    
        
        
        
        https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/593506/C-elementary-bitwise-O(1)-solution
    
 
    
    Иван 
    
    
        
        
        
        Не ну тут что-то слишком красиво у тебя)
    
 
    
    Evgeniy 
    
    
        
        
        
        А у тебя как?)
    
 
    
    V 
    
    
        
        
        
        а зачем тут нужен логарифм?
    
 
    
    Иван 
    
    
        
        
        
        Теперь не хочу показывать)
    
 
    
    Иван 
    
    
        
        
        
        сейчас
    
 
    
    Evgeniy 
    
    
        
        
        
        И это значит, что в этом диапазоне у чисел точно будут меняться биты
    
 
    
    Evgeniy 
    
    
        
        
        
        И битовое И даст 0
    
 
    
    Иван 
    
    
        
        
        
        Да, потому что если сделать & для чисел, чьё битовое представление требует на бит больше получится 0
    
 
    
    V 
    
    
        
        
        
        у меня вышло так
        https://github.com/vtambourine/leetcode-go/blob/master/0201.bitwise_and_of_numbers_range/bitwise_and_of_numbers_range.go
    
 
    
    Иван 
    
    
        
        
        
        А как вы кодом делитесь?
    
 
    
    Иван 
    
    
        
        
        
        С лииткода?
    
 
    
    V 
    
    
        
        
        
        я просто комичу решения в свой репозиторий
    
 
    
    Evgeniy 
    
    
        
        
        
        Пишу там пост в Discuss
    
 
    
    V 
    
    
        
        
        
        или что-то другое имеешь ввиду?
    
 
    
    Иван 
    
    
        
        
        
        Ну да, я вижу что у тебя гитхаб, тут понятно) Я удивился что Клён поделился. Но теперь понял, спасибо
    
 
    
    Evgeniy 
    
    
 
    
    Evgeniy 
    
    
        
        
        
        Показалось, что по времени не пройдет
    
 
    
    Порридж В Ко-ливинге 
    
    
 
    
    Порридж В Ко-ливинге 
    
    
        
        
        
        Там можно брутфорсом?
    
 
    
    Порридж В Ко-ливинге 
    
    
        
        
        
        Кто нить пробовал?
    
 
    
    Evgeniy 
    
    
        
        
        
        Да
    
 
    
    Evgeniy 
    
    
        
        
        
        Выше
    
 
    
    Порридж В Ко-ливинге 
    
    
        
        
        
        Там или O(N) или O(1) как я понял
    
 
    
    Evgeniy 
    
    
        
        
        
        Ну да
    
 
    
    Иван 
    
    
        
        
        
        https://pastebin.com/NERYLZzA
    
 
    
    Иван 
    
    
        
        
        
        Я так написал. Просто не знал как это более красиво оформить
    
 
    
    Иван 
    
    
        
        
        
        Но как я понимаю, Клён, у тебя точно такое же решение?
    
 
    
    Evgeniy 
    
    
        
        
        
        У меня нет цикла
    
 
    
    Иван 
    
    
        
        
        
        Этот цикл срабатывает очень редко)
    
 
    
    Иван 
    
    
        
        
        
        Только если m и n в одинаковом диапазоне степеней. Во всех остальных случаях 0(1).
    
 
    
    Evgeniy 
    
    
        
        
        
        При len 0 можно n & m убрать, например. Просто число вернуть
    
 
    
    Evgeniy 
    
    
        
        
        
        А что ифе делается?
    
 
    
    Evgeniy 
    
    
        
        
        
        где на нули проверяешь
    
 
    
    V 
    
    
        
                    
                        
                            
                            Кто нить пробовал?
                        
                    
                
        
        
        вот такой брутфорс у меня прошел:
        func rangeBitwiseAnd(m int, n int) int {
            ans := m
            for m < n {
          if ans == 0 {
           return 0
          }
                m++
                ans &= m
            }
            return ans
        }
    
 
 
    
    V 
    
    
        
        
        
        собственно, после этого решения я уже стал дулмать, как решить быстрее
    
 
    
    Иван 
    
    
        
        
        
        Вычисляется степень двойки последнего числа и первого. Просто при переходе на один разряд больше происходит обнуление. Например 7 - 111 а 8 -  1000.  0111 & 1000 = 0000 и дальше нет смысла проверять так как всегда будет 0
    
 
    
    Иван 
    
    
        
        
        
        Ну и значит если последнее число хотя бы на разряд больше первого - значит нет смысла цикл запускать
    
 
    
    Иван 
    
    
        
        
        
        рано или поздно превратится в 0
    
 
    
    Evgeniy 
    
    
        
        
        
        А, ну да. Та же идея, просто по другому)
    
 
    
    Evgeniy 
    
    
        
        
        
        То то я думал, чего так много нулей получается. При тестах
    
 
    
    Иван 
    
    
        
        
        
        Да) Сразу на мысли и наводит
    
 
    
    Viktor 
    
    
 
    
    Иван 
    
    
        
        
        
        А у меня так не прошло
    
 
    
    Иван 
    
    
        
        
        
        Причём последний кейс
    
 
    
    Viktor 
    
    
 
    
    Evgeniy 
    
    
        
                    
                        
                            
                            Да) Сразу на мысли и наводит
                        
                    
                
        
        
        https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/593239/Easy-python-with-explanation-(100-memory)
    
 
 
    
    Evgeniy 
    
    
        
        
        
        вот похоже на твоё, вроде
    
 
    
    Viktor 
    
    
        
        
        
        Я без логарифма проверку делал такую: n >= 2 * m – если больше чем в два раза значит одна степень двойки лежит между n и m. Единственно это может дать переполнение, поэтому несложное алгебраическое преобразование даёт ту же проверку n - m >= m.
    
 
    
    Viktor 
    
    
        
        
        
        В остальном брутфорсик вышел на коротком интервале.
    
 
    
    Иван 
    
    
 
    
    Evgeniy 
    
    
 
    
    Viktor 
    
    
        
        
        
        не, потом брутфорс. т.е. если мы понимает, что «точно нуля» не будет — в цикле сделаем, что просят.
    
 
    
    Evgeniy 
    
    
        
        
        
        Ясно, понял
    
 
    
    Viktor 
    
    
        
        
        
        @KlenZeleny а как у тебя вот это работает m & n & (~0 << shift), сможешь рассказать?
    
 
    
    Evgeniy 
    
    
        
        
        
        m & n оставит нам единицы, которые есть в каждом числе у границ диапазона. Но чтобы они остались нужно их & с единицей. ~0 даст нам набор единиц. А shift даст нам сдвиг на столько битов, сколько точно менялись при последовательном & для всех чисел.
    
 
    
    Иван 
    
    
        
        
        
        you are a machine)
    
 
    
    Evgeniy 
    
    
        
        
        
        И они нам не нужны. Но могут быть нужны старшие биты на "перекрытии" старших битов у двух границ.
    
 
    
    Evgeniy 
    
    
        
        
        
        Если проще, то мы выкидываем степени двойки, которые влезают в разницу n-m. Те, которые получится. И оставляем те, которые не получится
    
 
    
    Evgeniy 
    
    
        
        
        
        На то число степеней, которые выкинули, нам и нужен сдвиг
    
 
    
    Viktor 
    
    
        
        
                    
                
        
        Помните радостную для многих новость? В этом году в ШАД можно поступить и без знания хардкорной математики. Для таких студентов прочитают специальный адаптационный курс.
        
        До этого шадовцам, поступившим без сильной математической базы, приходилось гораздо сложнее. Прочитайте историю Ваге Егиазаряна о том, как Школа анализа данных вновь открыла для него высшую математику и путь в науку 🎓
        
        https://ya.cc/t/1KF88Iu9Ai2tD