web-dev-qa-db-ja.com

Web開発中にビット演算子を使用するのはいつですか?

私はビット演算子の概念を理解していますが、ビット演算子の使用に頼らざるを得なかったWeb開発プロセス中に多くのユースケースに出くわしたとは言えません。

  • ビット演算子を使用していますか?
  • なぜあなたはそれらを使うのですか?
  • いくつかのユースケースの例は何ですか?

この質問は、特にWeb言語でのビット演算子の使用を目的としていることを忘れないでください。

40
Aron Rotteveel

ビット単位の演算子の私の主な用途は、フラグのセットを表すどこにでも関連する可能性があります。たとえば、データベースにユーザーのセキュリティ権限のセットを表す整数があり、Webアプリでは、続行する前にそれらを確認する必要があります。

それらは&|のみを必要とする傾向があります-例:.

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

または

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

ビットshifting演算子は、私の経験では「ビジネス」アプリケーションではあまり役に立ちません。

52
Jon Skeet

ここでは、ビット単位のマスクが開発者のベルトにあるべき優れたツールであると思うので、より明確にします。上記の答えを拡張してみます。まず、整数を使用して状態フラグを維持する例(一般的な使用法):

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

set私の状態に、ビット単位のOR演算子:

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

'または'現在の状態と 'オン'をオンにしたい状態に注意してください。私の現在の状態を誰が知っているので、私はそれを吹き飛ばしたくありません。

unset私の状態にするには、ビット単位のAND演算子と補数演算子を使用します。

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

check現在の状態にするには、AND演算子を使用します。

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

なぜこれが面白いと思うのですか?状態を設定するインターフェースを設計しているとしましょう。 3つのブール値を受け入れるメソッドを作成できます。

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

または、単一の数値を使用して3つの状態すべてを表し、単一の値を渡すこともできます。

void setState( int nStateBits);

2番目のパターンを選択した場合、別の状態を追加することを決定したときに非常に満足します。インターフェイスの既存の実装を壊す必要はありません。

私の2セント。ありがとう。

83
tyler

Javaプログラマーの場合、xorビット演算子(^)は、2つのブール値間の排他的論理和ORテストをコーディングするための便利な方法を提供します。例:

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

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

注:ここでは実際のビット操作は行われていませんが、xorビット単位演算子(Web層またはその他の場所)を使用するのに便利な方法です。

(Javaに非常に似ているため、同じことがC#にも当てはまる可能性があります。ただし、わかりません。)

12
David

この質問はすでに回答済みですが、私の経験を&と共有したいと思います。

少し前に&を使用して、短絡した&&が目的の効果を簡単に達成できないASP.NETC#の演習を行っていたときに、サインアップフォームを検証しました。

私がやりたかったのは、フォーム内のすべての無効なフィールドを強調表示し、各無効なフィールドのすぐ横にエラーメッセージラベルを表示し、すべての有効なフィールドの強調表示を解除して、それらからエラーメッセージを削除することでした。

私が使用したコードは次のようなものでした。

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

&&の代わりに&を使用した場合、btnSubmitClickedメソッドのifステートメントは最初の無効なフィールドのみを強調表示し、その後の他のすべての無効なフィールドは強調表示されません。短絡した&&は、falseが検出された後、条件のチェックを停止するため、エラーメッセージは表示されません。

同じことを達成するためのより良い方法があるかもしれませんが、私はその時に&が有用であることに気づきました。

6
RestInPeace

フラグ以外に、スクリプト言語でビット演算を使用する理由はあまりありません。しかし、スタックの下位レベルを詳しく調べると、ビット演算がますます重要になります。

6
Robert Gould

通常、ビットレベルでの操作について心配する必要はありません。バイト、int、double、およびその他の高レベルのデータ型で考えることができます。しかし、個々のビットのレベルに到達できるようにしたい場合があります。

ビット演算子の最も一般的な使用例の1つは、 フラグ (phpの例)です。 ビット演算子 は、バイナリファイルIO操作でも使用されます。

2
CMS

私はemを頻繁に使用しますが、回避できる場所では使用しません。私が最も頻繁に使用したのは、次の2つの状況です。

  1. 安全な接続を介していないときにJavaScriptを使用してクライアントからフォームデータを暗号化することは、プレーンテキストを送信するよりもはるかに優れています。
  2. オンザフライで生成されるPHPからのストリーミングファイル構造(通常はいくつかのバイナリファイルタイプ)。
1
bmeck

トピック外の側面では、高級言語、特に解析された言語(PHPなど)では、ビット演算が大幅に遅くなります[要出典] 通常の算術より。したがって、Jonの権限チェックはパフォーマンスの観点からは問題ないかもしれませんが、Webドメインではあまり「ネイティブ」ではありません。

1
Henrik Paul

アクセスの許可以外でそれらを使用しなければならなかったのは、intに割り当てられたカラーIDを取得するパーサーに対して行っていたプロジェクトの場合のみでした。

つまり、

$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