3

プログラミングでは、以下の 2 番目の入力変数のように、1 つの関数入力変数でパラメーターをチェーンできる場合があります。

define('FLAGA',40);
define('FLAGB',10);
define('FLAGC',3);
function foo($sFile, $vFlags) {
  // do something
}
foo('test.txt',FLAGA | FLAGB | FLAGC);

PHP では、この 1 つのパイプ文字(|)をビット単位OR演算子と呼んでいます。foo()内部に何かを追加して、$vFlagsどのフラグが設定されているかを確認するにはどうすればよいですか?

4

3 に答える 3

5

このようなフラグは通常、2 の累乗として定義されていることがわかると思います。たとえば、次のようになります。

define('FLAGA',1);
define('FLAGB',2);
define('FLAGC',4); /* then 8, 16, 32, etc... */

あなたが正しく述べたように、これらはビット単位の OR 演算子を使用して組み合わせることができます。

foo('test.txt',FLAGA | FLAGB | FLAGC);

関数内でこれらのフラグをテストするには、次のようにビットごとの AND 演算子を使用する必要があります。

function foo($sFile, $vFlags) {
  if ($vFlags & FLAGA) {
    // FLAGA was set
  }
  if ($vFlags & FLAGB) {
    // FLAGB was set
  }
  //// etc...
}
于 2014-12-19T05:50:53.230 に答える
3

「flags」パラメータはbitmaskと呼ばれます。1 バイトには、設定されているか設定されていない 8 ビットが含まれます。すべてのビットに独自の意味を割り当てるだけです。設定されている場合は、その特定のビットに対してyesを意味し、そうでない場合はnoを意味します。

したがって、正しいビットを設定する正しい値でフラグを定義することから始める必要があります。任意の数値だけが正しい方法で結合されません。

define('FLAGA', 1);  // 00000001
define('FLAGB', 2);  // 00000010
define('FLAGC', 4);  // 00000100
define('FLAGD', 8);  // 00001000

上記を考慮FLAGB | FLAGDして、2 番目と 4 番目のビット セットを使用してビット マスクを作成します ( 00001010)。これを行うには、基数 2 (2 進数) と基数 10 (10 進数) の間の変換に慣れる必要があります。

これをテストするには、次を使用します&

$flags = FLAGB | FLAGD;

if ($flags & FLAGA) {
    echo 'flag A is set';
}

if ($flags & FLAGB) {
    echo 'flag B is set';
}

..
于 2014-12-19T05:53:09.347 に答える
0

ANDビット演算子が必要です&

define('FLAGA',40);
define('FLAGB',10);
define('FLAGC',3);

function foo($sFile, $vFlags) {
  if ($vFlags & FLAGA) {
    echo "FLAGA is set\n";
  }
  if ($vFlags & FLAGB) {
    echo "FLAGB is set\n";
  }
  if ($vFlags & FLAGC) {
    echo "FLAGC is set\n";
  }
}
foo('test.txt',FLAGA | FLAGB | FLAGC);

デモ

とは言うものの、ビット単位の操作は必然的に、各ビットが 2 の累乗を表すバイナリの観点から機能します。

define('FLAGA',1);
define('FLAGB',2);
define('FLAGC',4);
define('FLAGD',8); // etc.

それ以外の場合は、次のシナリオを想像してください。

define('FLAGA',8);
define('FLAGB',32);
define('FLAGC',40);

の値が 40 の場合$vFlags、どのフラグが設定されているかわかりません。次のいずれかになります。

FLAGA & FLAGB
FLAGA & FLAGB & FLAGC
FLAGA & FLAGC
FLAGB & FLAGC
FLAGC
于 2014-12-19T05:55:18.593 に答える