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

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

  • Используете ли вы побитовые операторы?
  • Почему вы их используете?
  • Каковы некоторые примеры использования?

Помните, что этот вопрос специально предназначен для использования побитовых операторов в веб-языках.

Ответ 1

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

Те имеют тенденцию требовать только & и | - например.

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

или

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

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

Ответ 2

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

// 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;

Чтобы установить мое состояние, я использую побитовый оператор OR:

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

Обратите внимание, как я 'или' мое текущее состояние с состояниями, которые я хочу повернуть 'on'. Кто знает, что такое мое нынешнее состояние, и я не хочу взорвать его.

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

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

Чтобы проверить мое текущее состояние, я использую оператор AND:

// 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);

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

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

Ответ 3

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

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

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

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

(То же самое относится к С#, так как он так похож на Java. Не уверен, хотя.)

Ответ 4

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

Ответ 5

Этот вопрос уже ответил, но я хотел бы поделиться своим опытом с &.

Я использовал & недавно, чтобы проверить форму регистрации, когда выполнял упражнение ASP.NET С#, где короткозамкнутый && не мог бы добиться желаемого эффекта так же легко.

То, что я хотел сделать, это выделить все недопустимые поля в форме и показать метку сообщения об ошибке рядом с каждым недопустимым полем и выслать все допустимые поля и удалить из них сообщения об ошибках.

Код, который я использовал, был примерно таким:

protected void btnSubmitClicked(...) {
  username = txtUsername.Text;
  email = txtEmail.Text;
  pass = txtPassword.Text;
  if (isUsernameValid(username) & isEmailValid(email) & isPasswordValid(pass)) {
    // form is valid
  } else {
    // form is invalid
  }
  ...
}

private bool isPasswordValid(string password) {
  bool valid = true;
  string msg = "";
  if (password.length < MIN_PASSWORD_SIZE) {
    valid = false;
    msg = "Password must be at least " + MIN_PASSWORD_SIZE + " long.";
  }

  highlightField(txtPassword, lblPassword, valid, msg);
  return valid;
}

private void highlightField(WebControl field, Label label, string valid, string msg) {
  if (isValid) {
    // de-highlight
    field.BorderColor = VALID_FIELD_COLOR;
  } else {
    // highlight the text field and focus on it
    field.BorderColor = INVALID_FIELD_COLOR;
    field.Focus();
  }

  label.Text = msg;
}

// and other similar functions for username and email

Если бы я использовал && вместо &, метод if-statement в методе btnSubmitClicked выделил бы только первое недопустимое поле, а все остальные недопустимые поля после этого не были бы выделены и его сообщение об ошибке не показано, потому что короткое замыкание && прекратит проверку состояния после того, как встретится ложь.

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

Ответ 6

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

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

Ответ 7

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

  • Шифрование данных формы с клиентом с использованием JavaScript, если не над безопасным соединением, но не намного, но лучше, чем отправка обычного текста.
  • Потоковые структуры файлов (как правило, некоторые двоичные типы файлов) из PHP, которые генерируются на лету.

Ответ 8

На стороне вне темы, на языках высокого уровня, особенно на анализируемых языках (например, PHP), побитовые операции на несколько медленнее [править] чем обычная арифметика. Таким образом, хотя проверка прав Jon может быть одобрена с точки зрения производительности, она не очень "родная" в веб-домене.

Ответ 9

Единственный раз, когда мне приходилось использовать их вне авторизации доступа, был проект, который я делал для парсера, который принял идентификаторы цвета, назначенные для 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;
}

Ответ 10

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

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

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

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