24

次の Stack Overflow の質問を読み、ビット単位と論理の違いを理解しました。

ただし、ビットごとまたは論理をいつ使用する必要があるかについては説明していません。

論理演算子ではなくビット単位の演算子を使用する必要がある場合と、その逆の場合はいつですか?

少しずつ比較する必要があるのはどのような状況ですか?

違いについて質問しているわけではありませんが、ビット単位の演算子を使用する必要がある状況について質問しています。

4

8 に答える 8

26

Bitwise は、他のものと同じように、PHP での処理に役立ちます。

複数の状態を同時にオンにできる値はどうですか?

<?php

// since we're setting constant values in base10 we must progressively double
// them since bitwise operations work in base2. you'll see why when we output
// these as binary values below.
const STATE_FOO = 1;
const STATE_BAR = 2;
const STATE_FEZ = 4;
const STATE_BAZ = 8;

// show base2 values of the above constants
echo sprintf("STATE_FOO's base2 value is %08d\n", decbin(STATE_FOO));
echo sprintf("STATE_BAR's base2 value is %08d\n", decbin(STATE_BAR));
echo sprintf("STATE_FEZ's base2 value is %08d\n", decbin(STATE_FEZ));
echo sprintf("STATE_BAZ's base2 value is %08d\n\n", decbin(STATE_BAZ));

// set state to FOO and FEZ
$state = STATE_FOO | STATE_FEZ;

echo sprintf("base10 value of \$state is %s\n", $state);
echo sprintf("base2 value of \$state is %08d\n", decbin($state));
echo sprintf("Does \$state include FOO state? %s\n", (bool)($state & STATE_FOO));
echo sprintf("Does \$state include BAR state? %s\n", (bool)($state & STATE_BAR));
echo sprintf("Does \$state include FEZ state? %s\n", (bool)($state & STATE_FEZ));
echo sprintf("Does \$state include BAZ state? %s\n", (bool)($state & STATE_BAZ));
echo sprintf("Is state equivalent to FOO and FEZ states? %s\n", ($state == (STATE_FOO | STATE_FEZ)));

出力:

STATE_FOO's base2 value is 00000001
STATE_BAR's base2 value is 00000010
STATE_FEZ's base2 value is 00000100
STATE_BAZ's base2 value is 00001000

base10 value of $state is 5
base2 value of $state is 00000101
Does $state include FOO state? 1
Does $state include BAR state?
Does $state include FEZ state? 1
Does $state include BAZ state?
Is state equivalent to FOO and FEZ states? 1
于 2015-01-16T21:46:29.443 に答える
16

ビット単位|&論理的||であり&&まったく異なります。

ビット演算子は、2つの数値のビットに対して演算を実行し、結果を返します。つまり、それはイエスでもノーでもないということです。それらが条件文で使用されている場合、それらは論理比較の一部として使用されることがよくあります。例えば:

if ($x & 2 == 2) {
    // The 2^1 bit is set in the number $x
}

論理演算子は、2つ(またはそれ以上)の条件/式を比較し、trueまたはfalseを返します。ifやなどの条件文で最も一般的に使用しますwhile。例えば:

if ($either_this || $or_this) {
    // Either expression was true
}
于 2011-01-16T14:26:31.020 に答える
7

ビット単位の演算子は、バイナリ値表現の場合に特に使用されます。

echo '0110011010' & '0101001001'; 
//0100001000

AND比較には論理演算子が最も好まれ、 and演算の場合はビット単位の演算子よりも少し高速ですXOR

if(func1() && func2())

false を返す場合func1()は、呼び出す必要はありませんfunc2()

if(func1() & func2())

戻り値に関係なく、両方の関数を呼び出します。

于 2012-09-07T10:17:15.540 に答える
5

ほとんどの場合、論理演算子を使用することをお勧めします。これらは、論理条件を組み合わせるために使用されます。通常、プログラムフローを制御するために使用されます($isAlive && $wantsToEat)

ビット単位の演算子は、整数の基になるバイナリ表現に対してビットごとに操作を実行する場合に使用されます。例: (5 & 3) == 7。他の人が示唆しているように、PHPで書かれる傾向のある種類のアプリケーションでは、通常、これに対する要求はあまりありません(ただし、Cなどの低レベル言語ではあります)。

于 2011-01-16T14:27:07.943 に答える
3

ビット単位の演算子は、数値のビットを操作するときに役立ちます。ここを見てください。それ以外の場合は、論理演算子を使用する必要があります。また、論理演算子も短絡しています。たとえば、がa && bあり、でaある場合falsebは評価されません。

免責事項:私はJavaのバックグラウンドを持っていますが、 PHPでも同じだと思います。

于 2011-01-16T14:27:00.123 に答える
1

それらは2つの非常に異なる演算子です。

2つの条件を同時に真にする場合は、論理を使用します&&。たとえば、「お誕生日おめでとう」は、その人の誕生日が今日で、アカウントにお金がある場合にのみ印刷したいと思います。これは、2つ以上の条件の合成を実行する場合、主にifステートメントとループ条件で使用されます(ただし、排他的ではありません)。

ビット演算(日常のPHPプログラミングでははるかにまれです)を実行する場合は、ビット演算を使用します&。これははるかにまれであり、ビット単位のマスキングを実行している可能性があります(ただし、疑わしいです)。したがって、両方の整数が表す結果のみが必要な場合があります。その場合は、と言うことができますnewAttribute = attribute1 & attribute2;

于 2011-01-16T14:28:10.733 に答える
0

さて、あると仮定すると$x = (false && some_function());、ここでは、最初の値がFALSEであっ$xたため、を呼び出さずにの値が設定されます。some_function()

しかし、とにかくその関数を呼び出す必要がある場合はどうなりますか?を使用し$x = (false & some_function());ます。

つまり、&&&がすべての値を調べてチェックするわけではないという理由だけで、は&&よりも多くの処理を使用します。1つの値がfalseであることがわかった場合、他の値を調べずにそれを返します。

また、論理演算では&&、論理演算の値を返すために使用される演算子を使用します。ここで、は値を設定&するために使用され、ステートメントでは常にtrueを返します。if

于 2011-01-16T14:29:57.697 に答える