""

Бинарные (двоичные) часы на жесткой логике

Обзоры бинарных часов

Бинарные часы показывают время в двоичном или двоично-десятичном коде. Он отображается жидкокристаллическими или светодиодными точками. Точки на циферблате разделены на три группы: часы, минуты, секунды.

В моделях, ориентированных на двоично-десятичное представление времени, каждая группа делится на два ряда, каждый соответствует разрядности числа: 0 или 1. При двоичном отображении часы, минуты, секунды выводятся в один ряд.

При столь необычном способе показа времени пользователю приходится некоторое время думать, чтобы мысленно перевести код на циферблате в часы и минуты. Для людей незнакомых с двоичным исчислением задача определения текущего времени становится непосильной.

У бинарных часов не только экзотический способ индикации времени, но и выпускаются они в стильных корпусах с необычными элементами оформления. Удивительные часы подчеркивают, что их обладатель — высокоинтеллектуальный человек.

  • бинарные часы
  • 25 марта 2016, 20:38
  • автор: leha_marader
  • просмотры: 9208
  • комментарии: 64

Хеллоу пипл.
Сегодня я остановлюсь на этих бинарных по моему подобные часы так называют часах.

  • бинарные часы
  • 12 февраля 2013, 18:09
  • автор: Yaroslav
  • просмотры: 2415
  • комментарии: 15

  • Iron Samurai,
  • Iron Samurai Lava Style,
  • бинарные часы,
  • наручные часы
  • 18 ноября 2012, 16:18
  • автор: dammit86
  • просмотры: 17813
  • комментарии: 31

Часы с сенсорным экраном, не знаю что побудило меня к покупке, но Жаба сильно не сопротивлялась =) и вот что из этого вышло…

Если коротко то покупкой доволен. Неплохие часы за разумные деньги.

  • бинарные часы
  • 31 мая 2012, 12:27
  • автор: NoXviLL
  • просмотры: 5123
  • комментарии: 11

  • бинарные часы
  • 11 марта 2012, 10:08
  • автор: demon157
  • просмотры: 3449
  • комментарии: 8

  • бинарные часы
  • 23 февраля 2012, 13:08
  • автор: >просмотры: 5157
  • комментарии: 29

  • бинарные часы
  • 25 января 2012, 18:56
  • автор: xdevil
  • просмотры: 2934
  • комментарии: 30

  • бинарные часы
  • 11 декабря 2011, 17:22
  • автор: Toporikk
  • просмотры: 3580
  • комментарии: 7

Светодиодные часы с двоичной индикацией.
Оригинальный недорогой аксессуар. Производит сильное впечатление на девушек (да и на мужиков тоже, чё уж там ;).
Типовая схема применения:
— Сколько времени?
— На, сам(а) считай, мне некогда! 😉
— >8-[O]

О битовых операциях

    Переводы , 11 марта 2016 в 0:37

В этой статье я расскажу вам о том, как работают битовые операции. С первого взгляда они могут показаться вам чем-то сложным и бесполезным, но на самом деле это совсем не так. В этом я и попытаюсь вас убедить.

Введение

Побитовые операторы проводят операции непосредственно на битах числа, поэтому числа в примерах будут в двоичной системе счисления.

Я расскажу о следующих побитовых операторах:

  • | (Побитовое ИЛИ (OR)),
  • & (Побитовое И (AND)),
  • ^ (Исключающее ИЛИ (XOR)),

(Побитовое отрицание (NOT)),

  • > (Побитовый сдвиг вправо).
  • Битовые операции изучаются в дискретной математике, а также лежат в основе цифровой техники, так как на них основана логика работы логических вентилей — базовых элементов цифровых схем. В дискретной математике, как и в цифровой технике, для описания их работы используются таблицы истинности. Таблицы истинности, как мне кажется, значительно облегчают понимание битовых операций, поэтому я приведу их в этой статье. Их, тем не менее, почти не используют в объяснениях побитовых операторов высокоуровневых языков программирования.

    О битовых операторах вам также необходимо знать:

    1. Некоторые побитовые операторы похожи на операторы, с которыми вы наверняка знакомы (&&, ||). Это потому, что они на самом деле в чем-то похожи. Тем не менее, путать их ни в коем случае нельзя.
    2. Большинство битовых операций являются операциями составного присваивания.

    Побитовое ИЛИ (OR)

    Побитовое ИЛИ действует эквивалентно логическому ИЛИ, но примененному к каждой паре битов двоичного числа. Двоичный разряд результата равен 0 только тогда, когда оба соответствующих бита в равны 0. Во всех других случаях двоичный результат равен 1. То есть, если у нас есть следующая таблица истинности:

    38 | 53 будет таким:

    A111
    B1111
    A | B11111

    В итоге мы получаем 1101112 , или 5510 .

    Побитовое И (AND)

    Побитовое И — это что-то вроде операции, противоположной побитовому ИЛИ. Двоичный разряд результата равен 1 только тогда, когда оба соответствующих бита операндов равны 1. Другими словами, можно сказать, двоичные разряды получившегося числа — это результат умножения соответствующих битов операнда: 1х1 = 1, 1х0 = 0. Побитовому И соответствует следующая таблица истинности:

    Пример работы побитового И на выражении 38 & 53:

    A111
    B1111
    A & B11

    Как результат, получаем 1001002 , или 3610 .

    С помощью побитового оператора И можно проверить, является ли число четным или нечетным. Для целых чисел, если младший бит равен 1, то число нечетное (основываясь на преобразовании двоичных чисел в десятичные). Зачем это нужно, если можно просто использовать %2 ? На моем компьютере, например, &1 выполняется на 66% быстрее. Довольно неплохое повышение производительности, скажу я вам.

    Исключающее ИЛИ (XOR)

    Разница между исключающим ИЛИ и побитовым ИЛИ в том, что для получения 1 только один бит в паре может быть 1:

    Например, выражение 138^43 будет равно…

    A111
    B1111
    A ^ B111

    С помощью ^ можно поменять значения двух переменных (имеющих одинаковый тип данных) без использования временной переменной.

    Также с помощью исключающего ИЛИ можно зашифровать текст. Для этого нужно лишь итерировать через все символы, и ^ их с символом-ключом. Для более сложного шифра можно использовать строку символов:

    Исключающее ИЛИ не самый надежный способ шифровки, но его можно сделать частью шифровального алгоритма.

    Побитовое отрицание (NOT)

    Побитовое отрицание инвертирует все биты операнда. То есть, то что было 1 станет 0, и наоборот.

    Вот, например, операция

    A

    A111
    11111

    Результатом будет 20310

    При использовании побитового отрицания знак результата всегда будет противоположен знаку исходного числа (при работе со знаковыми числами). Почему так происходит, узнаете прямо сейчас.

    Дополнительный код

    Здесь мне стоит рассказать вам немного о способе представления отрицательных целых чисел в ЭВМ, а именно о дополнительном коде (two’s complement). Не вдаваясь в подробности, он нужен для облегчения арифметики двоичных чисел.

    Главное, что вам нужно знать о числах, записанных в дополнительном коде — это то, что старший разряд является знаковым. Если он равен 0, то число положительное и совпадает с представлением этого числа в прямом коде, а если 1 — то оно отрицательное. То есть, 10111101 — отрицательное число, а 01000011 — положительное.

    Чтобы преобразовать отрицательное число в дополнительный код, нужно инвертировать все биты числа (то есть, по сути, использовать побитовое отрицание) и добавить к результату 1.

    Например, если мы имеем 109:

    A11111

    A

    111

    A+1

    1111

    Представленным выше методом мы получаем -109 в дополнительном коде.
    Только что было представлено очень упрощенное объяснение дополнительного кода, и я настоятельно советую вам детальнее изучить эту тему.

    Побитовый сдвиг влево

    Побитовые сдвиги немного отличаются от рассмотренных ранее битовых операций. Побитовый сдвиг влево сдвигает биты своего операнда на N количество битов влево, начиная с младшего бита. Пустые места после сдвига заполняются нулями. Происходит это так:

    A1111
    A N . Таким образом, 43 . Использование сдвига влево вместо Math.pow обеспечит неплохой прирост производительности.

    Побитовый сдвиг вправо

    Как вы могли догадаться, >> сдвигает биты операнда на обозначенное количество битов вправо.

    Если операнд положительный, то пустые места заполняются нулями. Если же изначально мы работаем с отрицательным числом, то все пустые места слева заполняются единицами. Это делается для сохранения знака в соответствии с дополнительным кодом, объясненным ранее.

    Так как побитовый сдвиг вправо — это операция, противоположная побитовому сдвигу влево, несложно догадаться, что сдвиг числа вправо на N количество позиций также делит это число на 2 N . Опять же, это выполняется намного быстрее обычного деления.

    Вывод

    Итак, теперь вы знаете больше о битовых операциях и не боитесь их. Могу предположить, что вы не будете использовать >>1 при каждом делении на 2. Тем не менее, битовые операции неплохо иметь в своем арсенале, и теперь вы сможете воспользоваться ими в случае надобности или же ответить на каверзный вопрос на собеседовании.

    Telegram-канал про новости технологий, которые влияют на каждого из нас: @your_tech

    Бинарное мышление и искусственное расщепление объекта

    Попалась ссылка на старую запись jim_garrison , которую приведу полностью

    “Голуби vs ястребы” и “умеренная оппозиция”.
    Вкратце по упомянутым пропагандистским техникам “голуби и ястребы” и “умеренная оппозиция” vs “террористы”, которые используют наши западные партнеры.

    1. “Ястребы” и “голуби”.
    Идет конфликт, в котором есть одна сторона (“кровавый диктатор”), против которой условный госдеп, и та, которой он симпатизирует (“восставший народ” или “молодая демократия”). Естественно, есть международное сообщество, которое должно получить внятное объяснение, почему “кровавого диктатора” нужно бомбить. “Кровавый диктатор”, естественно, этого не хочет, демонстрирует вменяемость и готовность к переговорам. Вот-вот должна прибыть какая-то международная миссия, или начаться переговоры. В этот момент происходит какое-то чудовищное злодеяние: вырезается деревня, используется химическое оружие и пр. Все обвиняют “кровавого диктатора”, он отрицает. Его позиции резко ухудшаются, он теряет легитимность и пр.
    Сторонники “кровавого диктатора” вопиют, что ему этого не нужно было, мол, нет никакого мотива, как раз ему нужны были переговоры.
    Тут выходит “аналитик” и начинает рассказывать про “ястребов” и “голубей”, мол, единства-то нет, есть группировки. Мол, да, самому диктатору может и не нужно было, но злодеяние совершила группировка “ястребов” с целью усилить свои позиции и подорвать позиции “голубей”. Не надо сомневаться, это генералы “кровавого диктатора”, он должен понести ответственность.

    2. “Умеренная оппозиция”.
    Есть те, кто долгие годы был абсолютным злом, например, талибы или Аль-Каида. В новой ситуации нужно легитимизировать союз с ними. Появляются умеренные талибы или умеренная Аль-Каида. Желающие могут поискать упоминания о переговорах с умеренными талибами или предложения Петреуса о союзе с умеренной Аль-Каидой.
    Но тут все равно уши торчат избыточно, когнитивный диссонанс реципиента пропаганды.
    Поэтому появляется “умеренная оппозиция”. Воюющие исламисты абсолютно искусственно разделяются на хорошую “умеренную оппозицию”/”демократическую оппозицию” и “радикальных исламистов”. При этом политическая поддержка условного госдепа оказывается как “умеренной оппозиции”, каковая в реальности представлена малочисленными группами, декларирующими демократические ценности, на поле боя же присутствуют, естественно, радикалы.

    И то, и то базируется на интуитивном представлении потребителя пропаганды, что должны быть и “голуби” с “ястребами”, более и менее умеренные исламисты и т.д. Они и в самом деле могут быть, но в пропаганде они должны быть именно тогда, когда в них появляется надобность.

    Тут можно заметить. что обе техники опираются на бинарность мышления.

    Бинарность мышления – базовое свойство восприятия вообще, и особенно – напряжённых, внутренне конфликтных ситуаций. Мышление бинарными оппозициями побуждает воспринимать ситуацию как совокупность двух полюсов, а каждый из полюсов как простой, объект с однозначными характеристиками (хороший / плохой, активный / пассивный, опасный / безвредный и т.п.). В конфликтных ситуациях один из полюсов – отрицательный, чёрный (см.рассуждение по этому поводу)

    Но бывает, что такое однозначное, нерасчленённое восприятие объекта на чёрном полюсе противоречит текущим задачам манипулятора. Например, нужно обосновать что-то такое, что не вписывается в ранее удобную бинарно поляризованную картину, и для конкретной задачи нужно как-то отойти от этой жёсткой логики.

    Отказ от однозначности мог бы идти путём усложнения картины, рассмотрения внутренней структуры и динамики, добавления градации качеств, релятивизации абсолютных характеристик и т.п. Но такой подход вообще разрушает бинарную картину, а это недопустимо.

    Поэтому вместо усложнения используется создание иллюзии внутреннего разделения в объекте, однозначное восприятие которого мешает манипулятору. При этом те части, на которые делится ранее единый объект, вновь оказываются простыми, однозначными, бинарно противопоставленными. С ними можно опять играть в бинарные игры. Два варианта таких игр и описаны выше.

    Троичный компьютер: Да, Нет, Может быть

    Информация, которой оперирует компьютер, так или иначе раскладывается на единицы и нули — графика, музыка, тексты, алгоритмы программ. Все просто и понятно: «включено» — «выключено», «есть сигнал» — «нет сигнала». Либо «истина», либо «ложь» — двоичная логика. А между тем еще в 1961-м, в год первого полета человека в космос, в Советском Союзе наладили производство необычных вычислительных машин, оперировавших не двоичной, а троичной логикой.

    История создания
    Строго говоря изобретателем первой вычислительной машины с троичной логикой в далеком 1840 году был английский изобретатель-самоучка Томас Фоулер. Его машина была механической и полностью деревянной.
    Ну а первыми, кто вернулся к этой идее (более чем через сто лет), были инженеры с кафедры вычислительной математики механико-математического факультета МГУ.

    Все началось в 1954 году: кафедре должны были передать электронно-вычислительную машину М-2, но не сложилось. А машину-то ждали, готовились ее устанавливать и налаживать, с нею связывались определенные ожидания и планы. И кто-то предложил: давайте построим свою.

    Взяли — и построили, благо в то время в МГУ существовали некоторые теоретические наработки. Руководителем группы, осуществлявшей проектирование и изготовление машины, был назначен Николай Петрович Брусенцов. Задача была такая: сделать машину предельно простой и недорогой (потому что никакого специального финансирования у проекта не было). Поначалу собирались делать двоичную ЭВМ, но позже — как раз из соображений экономичности и простоты архитектуры — пришли к решению, что она будет троичной, использующей «естественный» троичный симметричный код, простейший из симметричных кодов.

    К концу 1958 года был закончен первый экземпляр машины, которой дали имя «Сетунь» — по названию московской речки. «Сетунь» была относительно невелика для вычислительных машин того поколения и занимала площадь 25−30 квадратных метров. Благодаря своей изящной архитектуре она была способна выполнять 2000−4500 операций в секунду, обладала оперативной памятью в 162 девятитритных ячейки и запоминающим устройством на магнитном барабане емкостью 36−72 страницы по 54 ячейки каждая. Машинных команд было всего 27 (причем три так и остались невостребованными), благодаря чему программный код получался весьма экономным; программирование непосредственно в машинных кодах было настолько простым, что для «Сетуни» даже не разрабатывали свой ассемблер. Данные вводили в машину с перфоленты, результаты выводились на телетайп (причем, что любопытно, отрицательные цифры печатались как обычные, но перевернутые кверху ногами). При эксплуатации машина показывала 95−98% полезного времени (расходуемого на решение задач, а не на поиск неисправностей и устранение неполадок), а в те времена очень хорошим результатом считалось, если машина могла дать хотя бы 60%.

    На межведомственных испытаниях 1960 года машину признали пригодной для массового использования в КБ, лабораториях и вузах, последовало распоряжение о серийном выпуске «Сетуни» на Казанском заводе математических машин. С 1961 по 1965 год было построено 50 экземпляров, которые работали по всей стране. Затем производство свернули. Почему перестали выпускать «Сетунь», если она успешно использовалась всюду от Калининграда до Якутска? Одна из возможных причин в том, что компьютер оказался слишком дешевым в производстве и потому невыгодным для завода. Другая причина- косность бюрократических структур, противодействие ощущалось на каждом из этапов.

    Впоследствии Николай Брусенцов и Евгений Жоголев разработали более современную версию машины, использовавшую те же принципы троичности, — «Сетунь-70″, но она так и не пошла в серийное производство, единственный опытный образец работал в МГУ до 1987 года.

    “Сетунь” – единственный в мире серийный компьютер с троичной логикой.

    Трехзначная логика
    Если погрузиться в теорию, то у придуманной схоластами двоичной логики, т. е. логики, построенной на двух элементах (например, «истина» и «ложь»), есть глубокий недостаток: набор некоторых утверждений в ней приводит к парадоксам, то есть имеет противоречивое решение. От этого порока свободна троичная логика, которую исходно развивал великий гений древнего мира Аристотель.
    С древним ученым философом согласен и создатель троичного компьютера Николай Брусенцов, по мнению которого д вухзначная математическая логика не соответствует здравому смыслу: «закон исключенного третьего» отрезает иные заключения, кроме «истины» и «не-истины», а между тем процесс познания реальности человеком отнюдь не сводится к дихотомии «да/нет». Поэтому, утверждает Брусенцов, чтобы стать интеллектуальным, компьютеру следует быть троичным.

    Трехзначная логика отличается от двухзначной тем, что кроме значений «истина» и «ложь» существует третье, которое понимается как «не определено», «нейтрально» или «может быть». При этом сохраняется совместимость с двухзначной логикой — логические операции с «известными» значениями дают те же результаты.

    Логике, оперирующей тремя значениями, естественным образом соответствует троичная система счисления — троичная симметричная, если говорить точнее, простейшая из симметричных систем. К этой системе впервые обратился Фибоначчи для решения своей «задачи о гирях».

    В троичной симметричной системе используются цифры: -1, 0 и 1 (или, как их еще обозначают, -, 0 и +). Преимущества ее как симметричной системы состоят в том, что, во-первых, не нужно как-то особо отмечать знак числа — число отрицательно, если его ведущий разряд отрицателен, и наоборот, а инвертирование (смена знака) числа производится путем инвертирования всех его разрядов; во-вторых, округление здесь не требует каких-то специальных правил и производится простым обнулением младших разрядов.

    Кроме того, из всех позиционных систем счисления троичная наиболее экономична — в ней можно записать большее количество чисел, нежели в любой другой системе, при равном количестве используемых знаков: так, например, в десятичной системе, чтобы представить числа от 0 до 999, потребуется 30 знаков (три разряда, десять возможных значений для каждого), в двоичной системе теми же тридцатью знаками можно закодировать числа в диапазоне от 0 до 32767, а в троичной — от 0 до 59048. Самой экономичной была бы система счисления с основанием, равным числу Эйлера (e = 2,718…), и 3 — наиболее близкое к нему целое.

    Если в привычных нам двоичных компьютерах информация измеряется в битах и байтах, то компьютеры на троичной системе счисления оперируют новыми единицами: тритами и трайтами. Трит — это один троичный разряд; подобно тому, как бит может принимать значения 0 и 1 («ложь» и”истина»), трит может быть (+), (0) или (-) (то есть «истина», «неизвестно» или «ложь»).

    Один трайт традиционно (так было на «Сетуни») равен шести тритам и может принимать 729 различных значений (байт — только 256). Впрочем, возможно, в будущем трайты станут 9- или 27-разрядными, что естественнее, так как это степени тройки.

    Троичная система счисления
    В чем же плюсы троичной системы счисления (далее – СС) над двоичной?

    1) Меньше разрядов
    (Написано разжевано, чтобы каждый смог понять суть этого пункта)
    Возьмем число 10 в десятичной СС и переведем его в двоичную СС, получим 1010, переведем в троичную симметричную СС, получим +0+, ну а если в троичную несимметричную СС, то получим 101. Из этого мы видим, что в некоторых числах в троичной симметричной и несимметричной СС-ах меньше разрядов, чем в двоичной СС.
    Возьмем число 5 в десятичной СС и переведем его в двоичную СС, получим 101, переведем в троичную симметричную СС, то получим +–, ну а если в троичную несимметричную СС, то получим 12. Из этого мы видим, что в некоторых числах в троичной несимметричной СС меньше разрядов, чем в двоичной и троичной симметричной СС-ах.

    2) Емкость
    Троичная СС вмещает больший диапазон чисел, т.к. 3^n>2^n (где n-натуральное число). Например, если n=9, то 3^9=19683>2^9=512.

    3) Экономичность системы счисления
    Экономичность системы счисления — запас чисел, который можно записать в данной системе с помощью определенного количества знаков. Чем больше запас тем экономичнее система. По затратам числа знаков (в трёхразрядном десятичном числе 3*10=30 знаков) наиболее экономична из позиционных показательных несимметричных систем счисления. Обозначим p основание системы счисления, n количество требуемых знаков. Тогда получим n/p разрядов требуемых для записи этого набора знаков в заданной системе счисления, а количество чисел которое при этом можно записать будет равно pn/p.

    Настоящее и будущее троичных компьютеров
    После «Сетуни» было несколько экспериментальных проектов, осуществлявшихся энтузиастами (таких, например, как американские Ternac и TCA2), однако это были либо весьма несовершенные машины, далекие от двоичных аналогов, либо и вовсе программные эмуляции на двоичном «железе».

    Основная причина состоит в том, что использование в компьютерах троичных элементов пока не дает никаких существенных преимуществ перед двоичными: выпуск последних налажен массово, они проще и дешевле по себестоимости. Даже будь сейчас построен троичный компьютер, недорогой и по своим характеристикам сравнимый с двоичными, он должен быть полностью совместим с ними. Уже разработчики «Сетуни-70» столкнулись с необходимостью обеспечить совместимость: чтобы обмениваться информацией с другими университетскими машинами, пришлось добавить возможность читать с перфолент двоичные данные и при выводе также конвертировать данные в двоичный формат.

    Однако нельзя сказать, что троичный принцип в компьютеростроении — это безнадежный анахронизм. В последнее десятилетие возникла необходимость в поиске новых компьютерных технологий, и некоторые из этих технологий лежат в области троичности.

    Одно из таких исследовательских направлений — поиск альтернативных способов увеличения производительности процессоров. Каждые 24 месяца число транзисторов в кристалле процессора увеличивается примерно вдвое — эта тенденция известна как «закон Мура», и вечно продолжаться она не может: масштабы элементов и связей можно измерить в нанометрах, и очень скоро разработчики столкнутся с целым рядом технических сложностей. Кроме того, есть и экономические соображения — чем меньше, тем дороже разработки и производство. И с какого-то момента окажется дешевле поискать альтернативные способы делать процессоры мощнее, нежели продолжать гонку за нанометрами, — обратиться к технологиям, от которых раньше отказывались как от нерентабельных. Переход от однородных кремниевых структур к гетеропереходным проводникам, состоящим из слоев различных сред и способным генерировать несколько уровней сигнала вместо привычных «есть» и «нет», — это возможность повысить интенсивность обработки информации без увеличения количества элементов (и дальнейшего уменьшения их размеров). При этом от двухзначной логики придется перейти к многозначным — трехзначной, четырехзначной и т. д.

    Другое направление, также нацеленное на увеличение производительности, — разработки в области асинхронных процессоров. Известно, что обеспечение синхронности процессов в современных компьютерах изрядно усложняет архитектуру и расходует процессорные ресурсы — до половины всех транзисторов в чипе работает на обеспечение этой самой синхронности. Компания Theseus Logic предлагает использовать «расширенную двоичную» (фактически — троичную) логику, где помимо обычных значений «истина» и «ложь» есть отдельный сигнал «NULL», который используется для самосинхронизации процессов. В этом же направлении работают еще несколько исследовательских групп.
    Есть и более фантастические направления, где оправдано использование трехзначной логики: оптические и квантовые компьютеры.

    Метод двоичного подъёма

    Метод двоичного подъёма — один из самых простых методов для решения задачи LCA в online. Он не использует метод решения задачи RMQ и основан на методе динамического программирования.

    Содержание

    Описание алгоритма [ править ]

    Как и большинство on-line алгоритмов для решения задачи LCA, этот метод делает сначала препроцессинг, чтобы потом отвечать на запросы.

    Препроцессинг [ править ]

    Препроцессинг заключается в том, чтобы посчитать функцию: [math] dp[v][i] [/math] — номер вершины, в которую мы придём если пройдём из вершины [math] v [/math] вверх по подвешенному дереву [math] 2 ^ i [/math] шагов, причём если мы пришли в корень, то мы там и останемся. Для этого сначала обойдем дерево в глубину, и для каждой вершины запишем номер её родителя [math] p[v] [/math] и глубину вершины в подвешенном дереве [math] d[v] [/math] . Если [math] v [/math] — корень, то [math] p[v] = v [/math] . Тогда для функции [math] dp [/math] есть рекуррентная формула:

    [math]dp[v][i]= begin p[v] & i = 0,\ dp[dp[v][i – 1]][i – 1] & i : gt : 0. end[/math]

    Для того чтобы отвечать на запросы нам нужны будут только те значения [math] dp[v][i] [/math] , где [math] i leqslant log_2 [/math] , ведь при больших [math] i [/math] значение [math] dp[v][i] [/math] будет номером корня.

    Всего состояний динамики [math] O(n log)[/math] , где [math] n [/math] — это количество вершин в дереве. Каждое состояние считается за [math] O(1) [/math] . Поэтому суммарная сложность времени и памяти препроцессинга — [math] O(n log) [/math] .

    Ответы на запросы [ править ]

    Ответы на запросы будут происходить за время [math] O(log)[/math] . Для ответа на запрос заметим сначала, что если [math] c = LCA(v, u) [/math] , для некоторых [math] v [/math] и [math] u [/math] , то [math] d[c] leqslant min(d[v], d[u])[/math] . Поэтому если [math] d[v] lt d[u] [/math] , то пройдём от вершины [math] u [/math] на [math] (d[u] – d[v]) [/math] шагов вверх, это и будет новое значение [math] u [/math] и это можно сделать за [math] O(log) [/math] . Можно записать число [math] (d[u] – d[v]) [/math] в двоичной системе, это представление этого число в виде суммы степеней двоек, [math] 2 ^ + 2 ^ + ldots + 2 ^ [/math] и для всех [math] i_j[/math] пройти вверх последовательно из вершины [math] u [/math] в [math] dp[u][i_j] [/math] .

    Дальше считаем, что [math] d[v] = d[u] [/math] .

    Если [math] v = u [/math] , то ответ на запрос [math] v [/math] .

    А если [math] v neq u [/math] , то найдём такие вершины [math] x [/math] и [math] y [/math] , такие что [math] x neq y [/math] , [math] x [/math] — предок [math] v [/math] , [math] y [/math] — предок [math] u [/math] и [math] p[x] = p[y] [/math] . Тогда ответом на запрос будет [math] p[x] [/math] .

    Научимся находить эти вершины [math] x [/math] и [math] y [/math] . Для этого сначала инициализируем [math] x = v [/math] и [math] y = u [/math] . Дальше на каждом шаге находим такое максимальное [math] k [/math] , что [math] dp[x][k] neq dp[y][k] [/math] . И проходим из вершин [math] x [/math] и [math] y [/math] на [math] 2 ^ k [/math] шагов вверх. Если такого [math] k [/math] найти нельзя, то значения [math] x [/math] и [math] y [/math] , это те самые вершины, которые нам требуется найти, ведь [math] p[x] = dp[x][0] = dp[y][0] = p[y] [/math] .

    Оценим время работы. Заметим, что найденные [math] k [/math] строго убывают. Во-первых, потому что мы находим на каждом шаге максимальное значение [math] k [/math] , а во-вторых, два раза подряд мы одно и то же [math] k [/math] получить не можем, так как тогда получилось бы, что можно пройти [math] 2 ^ k + 2 ^ k = 2 ^ [/math] шагов, а значит вместо первого [math] k [/math] , мы бы нашли [math] k + 1 [/math] . А, значит, всего [math] O(log) [/math] значений [math] k [/math] , их можно перебирать в порядке убывания. Сложность ответа на запрос [math] O(log) [/math] .

    BestProg

    Битовые операторы

    Связанные темы

    Поиск на других ресурсах:

    1. Назначение битовых операторов. Перечень

    Язык Python поддерживает работу с двоичными разрядами (битами) целочисленных величин, где каждый бит числа рассматривается в отдельности. Для обеспечения этого в Python используются так называемые битовые или поразрядные операторы, которые реализуют общеизвестные битовые операции. Поддержка битовых операторов есть также в других языках программирования.

    В битовых операторах (операциях) каждый операнд рассматривается как последовательность двоичных разрядов (бит), которые принимают значение 0 или 1 (двоичная система исчисления). Над этими разрядами можно выполнять известные операции (логическое «И», логическое «ИЛИ» и т.д.)

    Перечень битовых операторов языка Python в порядке убывания приоритета следующий:

    – битовый оператор НЕТ (инверсия, наивысший приоритет);

  • , >> – операторы сдвига влево или сдвига вправо на заданное количество бит;
  • & – битовый оператор И (AND);
  • ^ – битовое исключающее ИЛИ (XOR);
  • | – битовый оператор ИЛИ (OR).
  • 2. Битовый оператор

    В битовом операторе (операции)

    инверсия значение любого бита числа изменяется на противоположное. Значение бита 0 устанавливается в 1, а значение 1 устанавливается в 0. То есть, положительное число становится отрицательным со смещением -1. Также отрицательное число становится положительным со смещением на -1.

    Пример.

    3. Операторы сдвига влево , вправо >> . Пример

    Операторы сдвига влево и сдвига вправо >> сдвигают каждый бит на одну или несколько позиций влево или вправо. Общая форма операторов следующая

    где op1 , op2 – операнды. Операндом может быть число, переменная целочисленного типа или выражение, возвращающее целочисленный результат.

    На рисунке 1 продемонстрирована работа операторов сдвига влево и сдвига вправо >> . При вычислении значения y , значение x сдвигается на 1 позицию влево (случай а) или вправо (случай b). Соответственно результат y множится на 2 или разделится на 2.

    Рисунок 1. Работа операций: а) сдвига влево (умножение на 2); b) сдвига вправо >> (целочисленное деление на 2)

    Если нужно помножить число на 16, то нужно сдвинуть это число на 4 бита влево. Если нужно разделить число на 8, то нужно сдвинуть это число на 3 бита вправо. Скорость выполнения операций сдвига выше в сравнении с операциями умножения и деления на числа кратные 2 в степени N ( N – количество сдвинутых бит).

    Пример.

    Результат работы программы

    4. Битовый оператор & (И, AND). Пример

    Битовый оператор И (AND) есть бинарным и выполняет побитовое «И» для каждой пары битов операндов, которые размещаются слева и справа от знака оператора & . Общая форма оператора следующая

    где op1 , op2 – операнды. Операндами могут быть числа, переменные целочисленного типа или выражения, которые возвращают целочисленный результат.

    Каждый целочисленный операнд рассматривается как набор бит, над любым из которых выполняется побитовая операция «И».

    На рисунке 2 показана работа битовой операции «И».

    Рисунок 2. Битовый оператор & «И»

    Как видно из рисунка, бит в позиции 0 первого операнда ( x ) вычисляется с битом в позиции 0 второго операнда ( y ), соответственно бит в позиции 1 первого операнда ( x ) вычисляется с битом в позиции 1 второго операнда ( y ) и т.д. При таких вычислениях результирующее значение любого бита определяется по следующим формулам:

    Пример.

    Результат работы программы

    5. Битовый оператор ^ (исключающее ИЛИ, XOR). Пример

    Битовый оператор исключительное ИЛИ обозначается символом ^ и выполняет операцию сложения по модулю 2 для любого бита операндов. Общая форма оператора следующая

    где op1 , op2 – целочисленные операнды.

    Оператор исключающего ИЛИ (XOR) оперирует двоичными разрядами. Каждый операнд рассматривается как последовательность бит. Результат побитового исключающего ИЛИ определяется по следующим формулам

    На рисунке 3 отображен пример битового исключающего ИЛИ для двух операндов.

    Рисунок 3. Битовый оператор «исключающее ИЛИ»

    Пример.

    Результат работы программы

    6. Битовый оператор | ИЛИ (OR). Пример

    Битовый оператор ИЛИ (OR) есть бинарным и обозначается символом | . Оператор реализует побитовое логическое сложение по образцу операторов & и ^ (см. п.п. 4, 5).

    Общая форма битового оператора | следующая

    где op1 , op2 – операнды, которые могут быть переменными или числами целого типа.

    Для двух операндов op1 , op2 битовое ИЛИ выполняется в соответствии со следующими правилами

    На рисунке 4 продемонстрирована работа битового оператора ИЛИ на примере двух произвольных операндов

    Рисунок 4. Битовый оператор ИЛИ

    Пример.

    Результат работы программы

    7. Примеры использования битовых операторов

    Пример 1. Вытянуть из числа 4,5,6 биты и определить их целочисленное значение.

    Результат работы программы

    Пример 2. Умножить значения двух чисел. В первом числе взять биты, которые размещенные в позициях 0-5. Во втором числе взять биты, которые размещены в позициях 0-7.

    Читайте также:  Как выбрать проводку для деревянного дома?
    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    ×
    ×
    Adblock
    detector