1

データベースでの上書きを処理するためにバイナリコードを使用していますが、ルールが一致しているかどうかを調べる必要があります。ルールに従っています。

  • 1 = タイトルのロックを解除
  • 2 = デスクのロック解除
  • 4 = アンロック価格
  • 8 = ストックのロック解除

PHPを使用するときは、MySQLの試合のように使用しようとします:

$overwirtes = 5;

if ( decbin($overwirtes) & decbin(1) )
{
    // unlock title
}

if ( decbin($overwirtes) & decbin(2) )
{
    // unlock desc
}

if ( decbin($overwirtes) & decbin(4) )
{
    // unlock price
}

if ( decbin($overwirtes) & decbin(8) )
{
    // unlock stock
}

タイトルと価格がロック解除され、説明と在庫がロックされていることを期待していますが、何かがうまくいかず、PHP は MySQL のようなバイナリを受け入れません。ルール。

4

1 に答える 1

2

「おかしな」問題に遭遇します。これはdecbin()文字列を返すものです。

ビットごとのAND演算子の両方のオペランドが文字列の場合、操作は文字列のASCII 値で実行されます。

また、これを示すマニュアルからの引用:

&、|の両方のオペランドの場合 および ^ 演算子stringの場合、操作は文字列を構成する文字のASCII 値に対して実行され、結果は文字列になります。それ以外の場合はすべて両方のオペランドが整数に変換され結果整数になります。

それで、それはあなたの特定の例ではどういう意味ですか?

2 番目の if ステートメントを見てみましょう。

$overwirtes = 5;
decbin($overwirtes) & decbin(2)

技術的には、これは次のように評価する必要があります。

0000 0101    (5)
0000 0010    (2)
---------- &
0000 0000    = 0 (FALSE)

ただし、両方のオペランドが文字列であるため、ビットごとの AND は両方の文字列の ASCII 値を取得します。これは次のようになります。

0011 0101    (53)  
0011 0010    (50) 
---------- &
0011 0000    = "48" (TRUE)

そのため、コード内のすべての条件が TRUE と評価されます。


しかし、今これを解決する方法は?簡単です。演算の 1 つのオペランドを整数に変更するだけです。decbin()したがって、 1、2、4、8 から呼び出しを削除できます。

また、1 つのオペランドが文字列 (ここでは整数) でない場合、両方のオペランドが暗黙的に整数にキャストされることをマニュアル (上記の引用) で確認できます。また、整数も受け取ります。

したがって、コードは次のようになります。

$overwirtes = 5;

if ( decbin($overwirtes) & 1)
{
    // unlock title
}

if ( decbin($overwirtes) & 2)
{
    // unlock desc
}

if ( decbin($overwirtes) & 4)
{
    // unlock price
}

if ( decbin($overwirtes) & 8)
{
    // unlock stock
}
于 2015-04-08T21:23:00.820 に答える