Варианты использования реального мира побитовых операторов [закрываются]

217
задан 5 revs, 5 users 75% 2 May 2012 в 08:57
поделиться

39 ответов

Давайте предположим, что у нас появляется всплывающее сообщение, вызванное сеансом Тайм-аут вроде события.

Как вы должны иметь для вашего онлайн-банкинга веб приложение.

Итак, сообщение появляется чтение, что у вас мало Больше минут, чтобы завершить онлайн опыт работы с этим конкретным Защищенный сайт.

Обычно, если вы ничего не делаете об этом, в примерно в то же время потребовалось сообщение для поп, приложение будет подписать вас.

На стороне клиента у вас есть JavaScript для времени эти действия.

Теперь, давайте скажем, что кнопка, которая вас подписывает называется «btnsignout».

Если вы хотите вызвать то же действие от Линия JS, на тайм-ауте, у вас должна быть что-то подобное:

if(timeout){
;
 }

, которое будет вызвать одно и то же событие, что нажав на «btnsignout» linkbutton.

Источник

-121--5000299-
  • Поля битов (флаги)
    Они наиболее эффективный способ представлять что-то, чье состояние определяется несколькими свойствами «да или нет». ACLS - хороший пример; Если у вас есть, скажем, 4 дискретных разрешения (прочитайте, пишите, выполняют, изменить политику), лучше хранить это в 1 байте, а не отходы 4. Они могут быть сопоставлены на типы перечисления на многих языках для дополнительного удобства.

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

  • Сжатие, шифрование
    Оба они сильно зависят от алгоритмов помин. Посмотрите на алгоритм , алгоритм для примера - все в битах, а не байты.

  • Конечные состоятельные машины
    Я говорю в первую очередь в первую очередь из такого типа, встроенного в какой-то кусок оборудования, хотя их можно найти в программном обеспечении. Это комбинаторные в природе - они могут буквально получать «компилировать» до кучу логических ворот, поэтому они должны быть выражены как , а , или , не и т. Д.

  • Графика Здесь вряд ли есть достаточно места, чтобы попасть в каждую область, где эти операторы используются в графическом программировании. XOR (или ^ ) особенно интересен здесь, потому что нанесение того же ввода во второй раз отменит первый. Пожилой интернет-интерфейс использовался для того, чтобы полагаться на это для выделения выделения и других наложений, чтобы устранить необходимость в дорогостоящих перерисах. Они все еще полезны в медленных графических протоколах (I.E. Удаленный рабочий стол).

Это были только первые несколько примеров, с которыми я придумал - это вряд ли исчерпывающий список.

209
ответ дан 23 November 2019 в 04:14
поделиться

Когда вы хотите только изменить некоторые биты выходов микроконтроллера, но регистр для записи является байтом, вы делаете что-то подобное (псевдокод):

char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs

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

-121--604481-

Вот некоторые распространенные идиомы, касающиеся флагов, хранящихся как отдельные биты.

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

Установите флаг тарификации:

flags |= Chargeable;

очистить флаг CallerIDMissing:

flags &= ~CallerIDMissing;

Проверьте, установлены ли CallerIDMissing и Chargeable:

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}
-121--604486-

Я видел, как они использовались в системах управления доступом на основе ролей.

1
ответ дан 23 November 2019 в 04:14
поделиться

Вы никогда не упоминали, какие СУБД вы используете. Если это PostgreSQL, адаптер Activerecord Postgres имеет A RESET_PK_PECENCENCENS! Метод, который вы можете использовать:

ActiveRecord::Base.connection.reset_pk_sequence!('table_name')
-121--1181569-

Они в основном используются для побитовых операций (сюрприз). Вот несколько реальных примеров, найденных в PHP CodeBase.

Кодировка символов:

if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {

Структуры данных:

ar_flags = other->ar_flags & ~SPL_ARRAY_INT_MASK;

Драйверы базы данных:

dbh->transaction_flags &= ~(PDO_TRANS_ACCESS_MODE^PDO_TRANS_READONLY);

Реализация компилятора:

opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;
1
ответ дан 23 November 2019 в 04:14
поделиться

Всякий раз, когда я впервые начал C программирование, я понял таблицы истины и все это, но все это не щелкнуло, как на самом деле использовать его, пока я не прочитал эту статью http://www.gamedev.net/reference /article/article1563.asp (который дает реальные образцы жизни)

1
ответ дан 23 November 2019 в 04:14
поделиться

Я только что использовал побитовый XOR ( ^ ) около трех минут назад для вычисления контрольной суммы для последовательной связи с ПЛК...

-121--604493-

Большинство средств визуализации (все, кроме Gecko, я думаю) реализуют открытые меню < select > и их опции в отдельном «окне», а не в качестве элементов на странице. Таким образом, страница не обязательно осведомлена о взаимодействии пользователя с открытым меню < select > . Это очень маловероятно, что вы сможете достичь желаемого эффекта во всех основных браузерах...

Изменить:... но, возможно, и так. Это работает для меня в Safari и Firefox. Я не могу протестировать в IE прямо сейчас, но дайте ему снимок:

var timer;
$('#container').mouseleave(function(e) {
    if($(e.target).parents('#container').length) {
        return;
    }
    timer = setTimeout(function() {
        $('#container select').blur();
    }, 50);
}).mouseenter(function(e) {
    if(timer) {
        clearTimeout(timer);
    }
});

Edit 2: на самом деле, Safari не запускает mouseleave (или mouseout ) вообще, когда < select > «окно» открыто.

-121--4244856-

Вы можете использовать их как быстрый и грязный способ хэширования данных.

int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;
9
ответ дан 23 November 2019 в 04:14
поделиться

Я использовал побитовые операции при внедрении модели безопасности для CMS. У него были страницы, которые могут быть доступны пользователями, если они были в соответствующих группах. Пользователь может быть в нескольких группах, поэтому нам нужно было проверить, было ли пересечение между группами пользователей и группами страниц. Таким образом, мы присваивали каждой группе уникальную мощность-2 идентификатора, например :

Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100

WE или эти значения вместе и храните значение (как один int) со страницей. Например. Если страница может быть доступна по группам A & B, мы храним значение 3 (которое в двоичном - 00000011) в качестве контроля доступа к страницам. Очень так же, как мы храним значение Oreed Group Identiers с пользователем, чтобы представлять, какие группы они находятся.

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

24
ответ дан 23 November 2019 в 04:14
поделиться

Когда у меня есть куча логических флагов, я люблю хранить их всех в Int.

Я получаю их, используя побитовые и. Например:

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

etc.

14
ответ дан 23 November 2019 в 04:14
поделиться

Bittive & используется для маскировки / извлечения определенной части байта.

1 Байтовая переменная

 01110010
&00001111 Bitmask of 0x0F to find out the lower nibble
 --------
 00000010

Особенно используется оператор Shift (<< >>), часто используются для расчетов.

6
ответ дан 23 November 2019 в 04:14
поделиться

Это пример для чтения цветов от растрового изображения в байтовом формате

byte imagePixel = 0xCCDDEE; /* Image in RRGGBB format R=Red, G=Green, B=Blue */

//To only have red
byte redColour = imagePixel & 0xFF0000; /*Bitmasking with AND operator */

//Now, we only want red colour
redColour = (redColour >> 24) & 0xFF;  /* This now returns a red colour between 0x00 and 0xFF.

Я надеюсь, что это крошечные примеры помогают ...

6
ответ дан 23 November 2019 в 04:14
поделиться

Я использую их, чтобы получить значения RGB (A), например, из упакованных значений цвета.

-121--604487-

Шифрование - это все побитовые операции.

Пример кодировки -121--604490-

Base64. Кодировка Base64 используется для представления двоичных данных в виде печатаемых символов для отправки по системам электронной почты (и для других целей). Base64 кодирование преобразует последовательность 8-битовых байтов в 6-битовые индексы поиска символов. Битовые операции, перемена, and'ing, or'ing, not'ing очень полезна для осуществления битовых операций, необходимых для кодирования Base64 и расшифровки.

Это, конечно, только 1 бесчисленных примеров.

4
ответ дан 23 November 2019 в 04:14
поделиться

Я удивлен, никто не выбрал очевидный ответ для эпоха Интернета. Расчет действительных сетевых адресов для подсети.

http://www.topweybhosts.org/tools/netmask.php

4
ответ дан 23 November 2019 в 04:14
поделиться

Я использую их для нескольких вариантов выбора, таким образом, я сохраняю только одно значение вместо 10 или более

2
ответ дан 23 November 2019 в 04:14
поделиться

В моем вопросе здесь есть реальный мир -
Ответить только на первое уведомление WM_KEYDown?

При употреблении сообщения WM_KEYDown в бит 30 API Windows C Указывает предыдущее состояние клавиши. Значение 1, если ключ находится вниз до отправки сообщения, или это равно нулю, если ключ выше

1
ответ дан 23 November 2019 в 04:14
поделиться

Это странно?

(value & 0x1) > 0

Это делится двумя (даже)?

(value & 0x1) == 0
46
ответ дан 23 November 2019 в 04:14
поделиться

Я использую их, чтобы получить значения RGB (A) из упакованных ColorValues.

21
ответ дан 23 November 2019 в 04:14
поделиться

Я только что использовал битона-XOR ( ^ ) около трех минут назад для расчета контрольной суммы для последовательной связи с ПЛК ...

8
ответ дан 23 November 2019 в 04:14
поделиться

Никто, кажется, не упомянул математику с фиксированной точкой.

(Да, я старый, хорошо?)

3
ответ дан 23 November 2019 в 04:14
поделиться

в абстрагированном мире сегодняшнего современного языка, не слишком много. Файл IO - это легкий, который приходит на ум, хотя это осуществляет побитовые операции на чем-то уже реализованном и не реализует что-то, что использует побитовые операции. Тем не менее, в качестве простого примера этот код демонстрирует удаление атрибута только для чтения в файле (чтобы его можно было использовать с новым FileStream, указывающим FileMode.Create) в C #:

//Hidden files posses some extra attibutes that make the FileStream throw an exception
//even with FileMode.Create (if exists -> overwrite) so delete it and don't worry about it!
if(File.Exists(targetName))
{
    FileAttributes attributes = File.GetAttributes(targetName);

    if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
        File.SetAttributes(targetName, attributes & (~FileAttributes.ReadOnly));

    File.Delete(targetName);
}

, что и пользовательские реализации, вот недавний пример: Я создал «Центр сообщений» для отправки защищенных сообщений из одной установки нашего распределенного приложения на другой. По сути, это аналогично электронной почте, в комплекте с Inbox, Outbox, отправленным и т. Д., Но он также имеет гарантированную доставку с прочитанными квитанциями, поэтому есть дополнительные подпапки за пределы «входящих» и «отправлено». То, что это составило, было требование для меня в целом определить то, что "в папке" или что "в отправленной папке". Из отправленной папки мне нужно знать, что читается, а что непрочитано. Из чего непрочитанный, мне нужно знать, что получено и что не получено. Я использую эту информацию для создания динамического пункта, где фильтрует локальный источник данных и отображает соответствующую информацию.

Вот как enum собран вместе:

    public enum MemoView :int
    {
        InboundMemos = 1,                   //     0000 0001
        InboundMemosForMyOrders = 3,        //     0000 0011
        SentMemosAll = 16,                  //     0001 0000
        SentMemosNotReceived = 48,          //     0011
        SentMemosReceivedNotRead = 80,      //     0101
        SentMemosRead = 144,                //     1001
        Outbox = 272,                       //0001 0001 0000
        OutBoxErrors = 784                  //0011 0001 0000
    }

Вы видите, что это делает? При иничении и (&) со значением «Входящие» enum, InBoundmemos, я знаю, что InBoundMeMosformyorders находится в почтовом ящике.

Вот вареная версия метода, которая создает и возвращает фильтр, который определяет вид на выбранную в данный момент папку:

    private string GetFilterForView(MemoView view, DefaultableBoolean readOnly)
    {
        string filter = string.Empty;
        if((view & MemoView.InboundMemos) == MemoView.InboundMemos)
        {
            filter = "<inbox filter conditions>";

            if((view & MemoView.InboundMemosForMyOrders) == MemoView.InboundMemosForMyOrders)
            {
                filter += "<my memo filter conditions>";
            }
        }
        else if((view & MemoView.SentMemosAll) == MemoView.SentMemosAll)
        {
            //all sent items have originating system = to local
            filter = "<memos leaving current system>";

            if((view & MemoView.Outbox) == MemoView.Outbox)
            {
                ...
            }
            else
            {
                //sent sub folders
                filter += "<all sent items>";

                if((view & MemoView.SentMemosNotReceived) == MemoView.SentMemosNotReceived)
                {
                    if((view & MemoView.SentMemosReceivedNotRead) == MemoView.SentMemosReceivedNotRead)
                    {
                        filter += "<not received and not read conditions>";
                    }
                    else
                        filter += "<received and not read conditions>";
                }
            }
        }

        return filter;
    }

чрезвычайно простую, но аккуратная реализация на уровне абстракции, которая обычно не требует побитовых операций Отказ

5
ответ дан 23 November 2019 в 04:14
поделиться

Я не думаю, что это считается побитовым, но массив Ruby определяет установленные операции через обычные целочисленные битирующие операторы. Итак [1,2,4] и [1,2,3] # => [1,2] . Точно так же для a ^ b # => установить разницу и A | B # => Союз .

1
ответ дан 23 November 2019 в 04:14
поделиться

- это число x Сила 2? (Полезно, например, в алгоритмах, где пристегивается счетчик, и действие должно быть принято только логарифмическое количество раз)

(x & (x - 1)) == 0

, который является самым высоким битом целого числа x ? (Это, например, можно использовать для поиска минимальной мощности 2, которая больше x )

x |= (x >>  1);
x |= (x >>  2);
x |= (x >>  4);
x |= (x >>  8);
x |= (x >> 16);
return x - (x >>> 1); // ">>>" is unsigned right shift

, который является самым низким 1 бит целого числа x ? (Помогает найти количество раз, делимых на 2.)

x & -x
2
ответ дан 23 November 2019 в 04:14
поделиться

Это также может быть удобно в реляционной модели SQL, давайте скажем, у вас есть следующие таблицы: Blogentry, BlogCategory

Traditonally Вы можете создать отношения N-N между ними, используя таблицу Blogentrycegry Или когда не так много записей BlogCategory, вы можете использовать одно значение в Blogentry, чтобы ссылаться на несколько записей BlogCategory, так же, как будто вы будете делать с помещенными enums, В большинстве RDBMS также есть очень быстрые операторы, чтобы выбрать на этом «помещенном» столбце ...

2
ответ дан 23 November 2019 в 04:14
поделиться

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

volatile uint32_t *register = (volatile uint32_t *)0x87000000;
uint32_t          value;
uint32_t          set_bit   = 0x00010000;
uint32_t          clear_bit = 0x00001000;

value = *register;            // get current value from the register
value = value & ~clear_bit;   // clear a bit
value = value | set_bit;      // set a bit
*register = value;            // write it back to the register

также HTONL () и Htons () реализуются с использованием & и | операторов (на машинах, чьи endianness (порядок байта) не соответствует порядку сети):

#define htons(a) ((((a) & 0xff00) >> 8) | \
                  (((a) & 0x00ff) << 8))

#define htonl(a) ((((a) & 0xff000000) >> 24) | \
                  (((a) & 0x00ff0000) >>  8) | \
                  (((a) & 0x0000ff00) <<  8) | \
                  (((a) & 0x000000ff) << 24))
24
ответ дан 23 November 2019 в 04:14
поделиться

& = и:
Маскировать конкретные биты.
Вы определяете определенные биты, которые должны быть отображены или не отображается. 0x0 & X очистят все биты в байте, пока 0xff не изменится x. 0x0f отобразит биты в нижней части.

Преобразование:
Для того, чтобы бросить короткие переменные в большей длины с битном идентичности необходимо настроить биты, так как -1 в ИНТ 0xFFFFFFFF, а -1 в долго 0xFFFFFFFFFFFFFFFF. Сохранять Идентичность вы применяете маску после преобразования.

| = или
Установить биты. Биты будут установлены независимо, если они уже установлены. Многие Datastructures (Bitfyfields) имеют такие флаги, как IS_HSET = 0, IS_VSet = 1, которые могут быть самостоятельно установлены. Чтобы установить флаги, вы применяете IS_HSet | IS_VSet (в C и сборка это очень удобно читать)

^ = XOR
Найти биты, которые одинаковы или отличаются.

~ = нет
Перевернуть биты.

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

Некоторые замечательные хаки:

http://www.ugcs.caltech.edu/~wnoise/Base2.html
http://www.jjj.de/bitwizardry/bitwizardrypage.html

11
ответ дан 23 November 2019 в 04:14
поделиться

Шифрование все побитовые операции.

11
ответ дан 23 November 2019 в 04:14
поделиться

Я считаю, что это третий вариант. Он не может просто использовать NEW T [n] , потому что тогда он должен был бы построить как можно больше объектов, как он выделяет. E.G

std::vector<Foo> v;
v.reserve(10);

Если ваша реализация просто заканчивалась New Foo [10] , то вы просто построили 10 экземпляров FOO.

Вместо этого он использует свой распределитель для выделения и освобождения Roam Memory (без построения объектов) и по мере необходимости (например, когда вы на самом деле Push_back объекты) размещают экземпляры, построенные копией в правильные места памяти в его Зарезервируйте использование размещения нового и удаляет их с явные вызовы в деструкутор (что-то, что вы бы делаете только в сочетании с размещением нового). Класс AlloCator предоставляет следующие методы для того, что я предполагаю, что использует реализации вектора

 void construct(pointer p, const_reference val);

  Returns:
    new((void *)p) T(val)

  void destroy(pointer p);

  Returns:
    ((T*)p)->~T()

(«Возврат», вероятно, должен прочитать «эффект» или аналогичный.)

Подробнее о Размещение нового

-121 1205517-

Когда вы хотите только изменить некоторые биты выходов микроконтроллера, но реестр написать, - это байт, вы делаете что-то подобное (псевдокод):

char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs

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

2
ответ дан 23 November 2019 в 04:14
поделиться

Я считаю, что это третий вариант. Он не может просто использовать New T [n] , потому что тогда он должен был бы построить как можно больше объектов, как он выделяет. E.G

std::vector<Foo> v;
v.reserve(10);

Если ваша реализация просто завершилась New Foo [10] , то вы просто построили 10 экземпляров FOO.

Вместо этого он использует свой распределитель для выделения и освобождения Roam Memory (без построения объектов) и по мере необходимости (например, при фактическом push_back объектов) размещает копировальные экземпляры в правильные места памяти в его Зарезервируйте использование Размещение нового и удаляет их с явные вызовы в деструкутор (что-то, что вы бы делаете только в сочетании с размещением нового). Класс Allocator предоставляет следующие методы для того, что я предполагаю, что использует реализации вектора

 void construct(pointer p, const_reference val);

  Returns:
    new((void *)p) T(val)

  void destroy(pointer p);

  Returns:
    ((T*)p)->~T()

(«возвраты», вероятно, следует прочитать «эффект» или аналогичный.)

Подробнее о New

-121 1205517-

Вот некоторые общие идиомы, касающиеся флагов, хранящихся в качестве индивидуальных битов.

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

Установите платный флаг:

flags |= Chargeable;

Очистить флаг CallerIdmissing:

flags &= ~CallerIDMissing;

Проверить, настроен ли CallerIdMissing и PRECITIMENT:

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}
24
ответ дан 23 November 2019 в 04:14
поделиться

Если вы когда-либо хотите рассчитать свой номер мода (%) определенной мощности 2, вы можете использовать Yournumber & 2 ^ N-1 , который в этом случае То же самое, что и Ваш ваша,% 2 ^ n .

number % 16 = number & 15;
number % 128 = number & 127;

Это, вероятно, полезно только для того, чтобы быть альтернативой эксплуатации модуля с очень большим дивидендам, который составляет 2 ^ п ... но даже тогда его скорость повышения по модульной работе незначительна в моем тесте на .NET 2.0. Я подозреваю, что современные компиляторы уже выполняют такие оптимизации. Кто-нибудь знает больше об этом?

2
ответ дан 23 November 2019 в 04:14
поделиться

Я использую их в качестве опционных обработчиков, например В списках управления ACCES для описания конкретных ресурсов.

Посмотрите на эту статью http://planetozh.com/blog/2006/05/php-bitow-itor-operators-example-of-use/

Редактировать:

Еще одна ссылка: http://blog.code-head.com/how-tom-write-a-permission-bition-us-ubs-bits-andphp

0
ответ дан 23 November 2019 в 04:14
поделиться

Я видел его в нескольких книгах разработки игр в качестве более эффективного способа умножения и разделите.

2 << 3 == 2 * 8 
32 >> 4 == 32 / 16
0
ответ дан 23 November 2019 в 04:14
поделиться

Я бы не стал объединять эти два как таковые; вызовы в Джанго будут происходить синхронно, что означает, что цикл событий Twisted будет заблокирован. Лучше рассматривать процесс Twisted как автономное приложение с использованием Django и иметь классический веб-сервер для обработки приложения Django.

Вы вряд ли найдете общий хост, который позволит вам запустить приложение Twisted, поэтому я бы пошел по маршруту VPS.

-121--4565852-

Насколько я знаю, запрещая использование iframes, невозможно загрузить одну страницу aspx в другую.

Вместо этого можно использовать функцию UserControls (ascx) при повторных ответах или ajax. Они могут содержать практически то же содержимое, что и страница, или использовать MasterPage.

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

Хотя я не уверен в других платформах для веб-разработки, у них может быть решение ближе к тому, что вы хотите сделать, поэтому, если asp.net не является «обязательным», вам следует рассмотреть возможность извлечения других платформ.

-121--2995497-

RAID 5/6!! Вы, вероятно, используете его прямо сейчас, когда взаимодействуете с этим веб-сайтом! Разве это не так реально , как становится!?

-3
ответ дан 23 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: