1

私は人生でBitewise ANDを使用したことがありません。私はこの演算子を調査しましたが、それが正確に何をするかについてはまだわかりません。それで、私が出会ったばかりのコードで、ビットワイズとは何ですか、そしてここで何をしているのか尋ねます:

CASE
               WHEN (ft.Receiver_Status & 2) = 2 THEN '3D'
               WHEN (ft.Receiver_Status & 1) = 1 THEN '2D'
               WHEN (ft.Receiver_Status & 32) = 32 THEN 'Invalid' -- AR 220312
               ELSE 'None'

Receiver_Status の値を比較する前に smallint を int に変換するなど、同じデータ型を強制していますか?

4

6 に答える 6

3

ビットごとの AND は、特定のビットが設定されているかどうかを確認します。ft.Receiver_Statusさまざまなフラグをさまざまなビットに格納する整数のようです。

  • 1バイナリでは、最初のビットが設定されて00001いるft.Receiver_Status & 1かどうかを確認しています。
  • 2バイナリでは、2番目のビットが設定されて00020いるft.Receiver_Status & 1かどうかを確認しています。
  • 32バイナリでは、5番目のビットが設定されて10000いるft.Receiver_Status & 32かどうかを確認しています。

これがどのように機能するかを正確に確認するために、AND 演算の結果は、位置nのビットが1f になり、最初と 2 番目の数値の両方の位置n1のビットが. 次の 2 進数を考えてみましょう。

011010001 (209)
000010000 ( 32)
---------------
000010000 ( 32)

あるいは、

011001001 (201)
000010000 ( 32)
---------------
000000000 (  0)
于 2013-11-12T18:43:31.887 に答える
2

ビット フラグについて読む必要があります。これは、より大きなデータ型 (バイトなど) 内の特定のビットが 1 に設定されているかどうかを確認する方法です。

例:

次のビットのコンテンツを噛むことを検討してください: 00110101. 5番目の位置を確認したいと思います。他のすべてのビットを に変更して、それが または であるかどうかを確認する必要があり0ます。これを行うには、次のように一口ずつ実行します。10AND2^4

00110101
00010000 &
--------
00010000
于 2013-11-12T18:43:38.753 に答える
1

これらの他のすべての優れた答えを具体的な例に挙げると、Receiver_Flagsがである場合312ビットがオンになります。同様に、 の場合34232ビットがオンになります。

多くの場合、enumこれらのフィールドの設定には が使用されます。この列挙型を検討してください:

public enum Flags
{
    ThreeD = 1,
    TwoD = 2,
    Invalid = 3
}

次のように値を設定できます。

Receiver_Flags = Flags.ThreeD | Flags.TwoD

値は になります3。その場合、1および2ビットがオンになります。

于 2013-11-12T18:44:49.390 に答える
1

これは とよく似ていEnum.HasFlagます。Testこれを列挙型に実装する 1 つの方法を次に示します。

static bool HasFlag(Test flags, Test flag)
{
    return (flags & flag) != 0;
}

基本的に、5 ビット目がor かどうかを(ft.Receiver_Status & 32) = 32チェックします。10

于 2013-11-12T18:45:00.790 に答える