42

私はビット単位演算子の概念を理解していますが、Web 開発プロセス中にビット単位演算子を使用しなければならない多くのユース ケースに遭遇したとは言えません。

  • ビット演算子を使用していますか?
  • なぜそれらを使用するのですか?
  • ユースケースの例を教えてください。

この質問は、Web 言語でのビット演算子の使用を特に意図していることを覚えておいてください。

4

10 に答える 10

86

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

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

現在の状態と、「オン」にしたい状態をどのように「または」合わせるかに注目してください。私の現在の状態が何であるかを誰が知っているか、そして私はそれを吹き飛ばしたくありません.

状態の設定を解除するには、ビットごとの AND 演算子と補数演算子を使用します。

// 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...
}

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

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

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

void setState( int nStateBits);

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

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

于 2008-11-04T08:16:36.210 に答える
53

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

&それらは必要とする傾向があります|- 例

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

また

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

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

于 2008-11-04T06:31:27.670 に答える
13

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

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

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

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

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

于 2008-11-04T13:42:03.823 に答える
6

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

于 2008-11-04T06:47:00.153 に答える
6

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

&少し前に ASP.NET C# の演習を行っていたときに、サインアップ フォームを検証するために使用し&&ました。

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

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

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 ステートメントはbtnSubmitClicked最初の無効なフィールドのみを強調表示し、その後の他のすべての無効なフィールドは強調表示されず、エラー メッセージは表示されません&&。 false が発生しました。

同じことを達成するためのより良い方法があるかもしれませんが、&その時は役に立ちました。

于 2013-11-14T02:30:56.940 に答える
2

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

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

于 2008-11-04T06:35:05.247 に答える
1

私はemを頻繁に使用しますが、それらを避けることができる場所では決して使用しません. 私がそれらを最も頻繁に使用したのは、次の2つの状況です。

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

トピックとは関係ないことですが、高水準言語、特に解析言語 (PHP など) では、ビット演算は通常の算術演算よりも[要出典]が非常に遅くなります。したがって、Jon のパーミッション チェックは、パフォーマンスの観点からは問題ないかもしれませんが、Web ドメインではあまり「ネイティブ」ではありません。

于 2008-11-04T06:43:23.887 に答える
-2

賢く使えばビット演算子はとても強いと思います。

「オンラインストア」があるとします。また、一部のアイテムは複数のカテゴリに分類されます。

多対多の関係を作成する必要があります。または、カテゴリに追加のバイナリ ID を与えて、製品にカテゴリ ID のビットごとの組み合わせを格納するだけです。

数行では詳しく説明できないと思います。ごめん

于 2009-11-11T16:56:08.823 に答える