2016-12-19 9 views
1

私はこの問題に困惑しています。私はこのようなAccessでいくつかの機能VBAコードを持っています。VBA IF(XとY)> 0にアクセスし、

If (intFrontLoaded And 2) > 0 Then boolFrontLoad(1) = True Else boolFrontLoad(1) = False 
If (intFrontLoaded And 4) > 0 Then boolFrontLoad(2) = True Else boolFrontLoad(2) = False 
If (intFrontLoaded And 8) > 0 Then boolFrontLoad(3) = True Else boolFrontLoad(3) = False 
If (intFrontLoaded And 16) > 0 Then boolFrontLoad(4) = True Else boolFrontLoad(4) = False 
If (intFrontLoaded And 32) > 0 Then boolFrontLoad(5) = True Else boolFrontLoad(5) = False 
If (intFrontLoaded And 64) > 0 Then boolFrontLoad(6) = True Else boolFrontLoad(6) = False 

私は(intFrontLoaded And X) > 0)の仕組みを理解しようとしています。 intFrontLoaded = 14の場合、boolFrontLoad(1)、(2)、(3)がtrueになります。例: intFrontLoaded = 28の場合、boolFrontLoad(2)、(3)、(4)がtrueになります。

私は2 + 4 + 8 = 12と4 + 8 + 16 = 28であることを理解していますが、(intFrontLoaded And X) > 0)はどのように計算しますか?

答えて

3

Andbitwise AND演算子です。テストでは、単一のフラグビットがチェックされています。たとえばintFrontLoaded = 14の例をIf (intFrontLoaded And 4) > 0 Thenとしましょう。

14 as bitflags is this: 0000 0000 0000 1110 
4 is this:    0000 0000 0000 0010 

Andの結果はすべて同じです。

If 4 > 0 Then 

だから、それが実行される:上記の例では、そのように、And演算の結果は、4

今式にそのバックプラグのみ「フラグ」ビット、4です「真の」状態。もしあなたが気づくならば、すべてのテストは2の累乗です。これは、バイナリとして表現されているときには、それらはただ1つのビットに過ぎないからです。

基本的に、intFrontLoadedは、テストされている各ビットに対して単一のブール値を格納しています。これは、初期のコンピューティングではメモリが割高で、ブール値を格納するために16ビットすべてを使用すると無駄と見なされたときにはるかに一般的でした。あなたはこれを簡略化することができ

注:これはbitwise動作と呼ばれる

boolFrontLoad(1) = intFrontLoaded And 2 
boolFrontLoad(2) = intFrontLoaded And 4 
boolFrontLoad(3) = intFrontLoaded And 8 
boolFrontLoad(4) = intFrontLoaded And 16 
boolFrontLoad(5) = intFrontLoaded And 32 
boolFrontLoad(6) = intFrontLoaded And 64 
2

演算子はビット単位のAND演算です。各演算子のビットを比較し、両者のビットが共通の値を返します。あなたのコードのように非常に明確に書かれたことになる、と述べ

:この文脈で

boolFrontLoad(1) = (intFrontLoaded And 2) > 0 
boolFrontLoad(2) = (intFrontLoaded And 4) > 0 
boolFrontLoad(3) = (intFrontLoaded And 8) > 0 
boolFrontLoad(4) = (intFrontLoaded And 16) > 0 
boolFrontLoad(5) = (intFrontLoaded And 32) > 0 
boolFrontLoad(6) = (intFrontLoaded And 64) > 0 
1

。論理AndはビットごとにビットごとにintFrontLoaded And Xの間で実行されます。 Xが2の累乗である場合、たとえば2^aの場合、バイナリ表現は、(a + 1)番目の位置(右から左にビットの番号を付ける)を除いてゼロで構成されます。

したがって、intFrontLoaded And 4は、intFrontLoadedの3番目のビットが設定されているかどうかを確認します。結果がゼロでない場合、IFは成功します。

コードではintFrontLoadedがビットセットとして使用されます。つまり、各ビットがブール条件のフラグを表すフラグのセットです。

関連する問題