Я думаю, что вторая часть вопроса:
Кроме того, для чего используются побитовые операторы? Я был бы признателен за некоторые примеры.
Был только частично рассмотрен. Это мои два цента по этому вопросу.
Побитовые операции в языках программирования играют фундаментальную роль при работе с множеством приложений. Практически все низкоуровневые вычисления должны выполняться с использованием таких операций.
Во всех приложениях, которые должны отправлять данные между двумя узлами, такими как:
- компьютерные сети;
- телекоммуникационные приложения (сотовые телефоны, спутниковая связь , и т. д.).
На уровне связи нижнего уровня данные обычно отправляются в так называемых кадрах. Фреймы - это просто строки байтов, которые отправляются через физический канал. Эти кадры обычно содержат фактические данные плюс некоторые другие поля (закодированные в байтах), которые являются частью того, что называется заголовком. Заголовок обычно содержит байты, которые кодируют некоторую информацию, связанную с состоянием связи (например, с флагами (битами)), счетчики кадров, коды коррекции и обнаружения ошибок и т. Д. Чтобы получить переданные данные в кадре и построить кадры для отправки данных, вам понадобятся наверняка побитовые операции.
В общем, при работе с такими приложениями API доступен, поэтому вам не нужно разбираться со всеми этими деталями. Например, все современные языки программирования предоставляют библиотеки для соединений сокетов, поэтому на самом деле вам не нужно создавать кадры связи TCP / IP. Но подумайте о хороших людях, которые запрограммировали эти API для вас, им наверняка пришлось иметь дело с рамочной конструкцией; используя все виды побитовых операций для перехода от низкоуровневой связи к высокоуровневой связи.
Как конкретный пример, представьте, что кто-то дает вам файл, который содержит необработанные данные, которые были захвачены напрямую с помощью телекоммуникационного оборудования. В этом случае, чтобы найти кадры, вам нужно будет прочитать необработанные байты в файле и попытаться найти какие-то слова синхронизации, сканируя данные по частям. После определения слов синхронизации вам нужно будет получить фактические кадры и, если необходимо, SHIFT их (и это только начало истории), чтобы получить фактические данные, которые передаются.
Еще одна очень различное семейство приложений низкого уровня - это когда вам нужно управлять оборудованием, используя некоторые (древние) порты, такие как параллельные и последовательные порты. Эти порты управляются путем установки некоторых байтов, и каждый бит этих байтов имеет конкретное значение с точки зрения инструкций для этого порта (см., Например, http://en.wikipedia.org/wiki/Parallel_port ). Если вы хотите создать программное обеспечение, которое что-то делает с этим оборудованием, вам понадобятся побитовые операции для перевода инструкций, которые вы хотите выполнить, в байты, которые порт понимает.
Например, если у вас есть некоторые физические кнопки, подключенные к параллельному порту для управления другим устройством, это строка кода, которую вы можете найти в мягком приложении:
read = ((read ^ 0x80) >> 4) & 0x0f;
Надеюсь, что это поможет.
Чтобы получить то, что вам нужно, вам нужно запустить это обновление:
var ref = firebase.database.ref("zzACGAFCG");
ref.update({ "-LH9-nBF6Wx3g6oSq154": "-LHFN0BZ2FNWUExOnulR^NA" });
Это минимально, как может быть, поэтому я предполагаю, что вам нужно будет сделать некоторые больше работы в вашем коде, чтобы попасть сюда. Я дам вам некоторую справочную информацию о том, как работают обновления нескольких местоположений.
Самое важное, что нужно понять, это то, что инструкция обновления перебирает все ключи / пути в объекте, который вы предоставляете и, по существу, выполняет операцию set
для каждого из них.
Скажите, что у вас есть следующий JSON:
{
"root": {
"messages": {
"message1": "blablabla",
"message2": "blablabla"
}
}
}
Если вы запустите это заявление об обновлении:
var root = firebase.database().ref("root");
root.update({ messages: { message3: "new message" } });
Затем весь узел /root/messages
будет заменен обновлением, поэтому результат будет:
{
"root": {
"messages": {
"message3": "new message"
}
}
}
Как я уже говорил, за пределами первого уровня ключей / путей в ваших объектах обновления , база данных выполняет операцию set()
. Это не делает глубокое слияние.
Если вы хотите исправить узел на более низком уровне, вам необходимо убедиться, что у вас есть весь путь к свойству, которое вы хотите обновить в ключе обновить объект. Итак:
root.update({ "messages/message3": "new message" });
приведет к:
{
"root": {
"messages": {
"message1": "blablabla",
"message2": "blablabla",
"message3": "new message"
}
}
}
PushIDSnapVal
. Если можно, настройте что-то вроде jsbin, который воспроизводит его, и я посмотрю. – Frank van Puffelen 13 July 2018 в 17:46