Когда использовать Побитовые операторы во время веб-разработки?

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

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

40
задан Aron Rotteveel 2 October 2011 в 16:43
поделиться

9 ответов

Мое основное использование для побитовых операторов могло быть релевантным где угодно - представление ряда флагов. Например, у Вас могло бы быть целое число в базе данных, представляющей ряд прав доступа для пользователя, и в Вашем веб-приложении необходимо будет проверить тех перед продолжением.

Те склонны только требовать & и | - например,

if ((permissions & Permission.CreateUser) != 0)
{
    ...
}

или

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

Бит смещение , операторы менее полезны в "бизнес-" приложениях, по моему опыту.

52
ответ дан Jon Skeet 27 November 2019 в 01:01
поделиться

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

// These are my masks
private static final int MASK_DID_HOMEWORK  = 0x0001;
private static final int MASK_ATE_DINNER    = 0x0002;
private static final int MASK_SLEPT_WELL    = 0x0004; 

// This is my current state
private int m_nCurState;

К [1 118] устанавливает мое состояние, я использую оператор битового "ИЛИ":

// Set state for'ate dinner' and 'slept well' to 'on'
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);

Уведомление, как я 'или' мое текущее состояние в с состояниями, которые я хочу включить. Кто знает то, что мое текущее состояние, и я не хочу сдувать его.

К [1 119] сбрасывает мое состояние, я использую поразрядную операцию И с дополнительным оператором:

// Turn off the 'ate dinner' flag
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);

К [1 120] проверка мое текущее состояние, я использую операцию И:

// Check if I did my homework
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) {
    // yep
} else { 
    // nope...
}

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

void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);

Или, я мог использовать единственное число, чтобы представить все три состояния и передать единственное значение:

void setState( int nStateBits);

при выборе второго шаблона Вы будете очень счастливы, когда решат добавить другое состояние - Вы не должны будете повреждать существующий impls своего интерфейса.

Мои два цента. Спасибо.

83
ответ дан tyler 27 November 2019 в 01:01
поделиться

Для программистов Java xor побитовый оператор (^) обеспечивает полезный способ кодировать тест исключающего ИЛИ между двумя булевскими переменными. Пример:

boolean isFoo = ...
boolean isBar = ...

if (isFoo ^ isBar) {
    // Either isFoo is true or isBar is true, but not both.

Примечание: нет никакой фактической побитовой обработки, продолжающейся здесь, но это - полезный способ использовать xor побитовый оператор (в ярусе веб-узлов или где-либо еще).

(То же может относиться к C#, так как это настолько подобно Java. Не уверенный, все же.)

12
ответ дан 27 November 2019 в 01:01
поделиться

Кроме того, от флагов, нет большой причины использовать битовые операции в языках сценариев. Но как только Вы копаетесь в более низких уровнях своего стека, битовые операции становятся все более очень важными.

6
ответ дан Robert Gould 27 November 2019 в 01:01
поделиться

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

Один из наиболее распространенных случаев использования побитовых операторов флаги (php пример). Эти побитовые операторы также используются в двоичном файле операции IO.

2
ответ дан CMS 27 November 2019 в 01:01
поделиться

Я использую их время от времени, но никогда в местах, где я могу избежать их. Чаще всего я использовал их, следящий за двумя ситуациями.

  1. данные формы Шифрования от клиента, использующего JavaScript если не по безопасному соединению, не очень, но лучше, чем отправка простого текста.
  2. файловые структуры Потоковой передачи (обычно некоторый тип двоичного файла) от PHP, которые сгенерированы на лету.
1
ответ дан bmeck 27 November 2019 в 01:01
поделиться

На вне темы стороне вещей, на высокоуровневых языках, особенно на проанализированных языках (таких как PHP), битовые операции являются тоннами медленнее <глоток> [необходима цитата] , чем нормальная арифметика. Так, в то время как проверка разрешения Jon могла бы быть в порядке с точки зрения производительности, это не является 'очень собственным' в веб-домене.

1
ответ дан Henrik Paul 27 November 2019 в 01:01
поделиться

Единственное время я должен был использовать их за пределами авторизации доступа, было для проекта, который я делал для синтаксического анализатора, который взял Цветные идентификаторы, присвоенные ints

, т.е.

$color_red= 1;
$color_blue = 2;
$color_yellow = 8;

$color_purple = 3;
$color_orange = 9;
$color_green  = 10;

тогда мне дали, свойство

$can_collect_200_dollars = 10;

тогда раньше поразрядно сравнивало цвет, данный со свойством

if($given_color & $can_collect_200_dollars)
{
    $yay_i_got_200_dollars = true;
}else{
    $bummer_i_am_going_to_jail = true;
}
0
ответ дан Jayrox 27 November 2019 в 01:01
поделиться

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

Предположим, у вас есть «Интернет-магазин». И некоторые из ваших элементов попадают в несколько категорий.

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

. Я думаю, что в нескольких строках я не могу подробно объяснить. ИЗВИНИТЕ

-2
ответ дан 27 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

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