0

入力として int を取得します (実際には、int に変換する必要がある文字列です)。
この int はビットに変換する必要があります。
1 のビット位置ごとに、位置を取得する必要があります。
私のデータベースでは、この位置を値として持つ int 値フィールドを持つすべてのレコードが必要です。
私は現在、エンティティ(databaseValueを保持している)に位置と一致するかどうかを尋ねる必要がある次の単純なコードを持っていますが、明らかに正しく機能しません:

Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);

まず、明らかにビット型がないため、バイトの配列があります。Boolean[] を使用する必要がありますか? では、どうすればこの配列を埋めることができますか? 最後に、前のステートメントが解決された場合は、bits[position] を返すだけです。

これはどういうわけかビットマスクで解決する必要があるように感じますが、どこから始めればよいかわかりません..

どんな助けでもいただければ幸いです

4

3 に答える 3

4

BitArrayがあなたの求めているものだと思います。または、ビットマスクを自分で使用することは難しくありません。

for (int i=0; i < 32; i++)
{
    if ((value & (1 << i)) != 0)
    {
        Console.WriteLine("Bit {0} was set!", i);
    }
}
于 2008-12-17T15:44:31.887 に答える
4

あなたの感覚は正しいです。これは、ビットマスクで解決する必要があります。BitConverter はビットを返しません (「ビット」は実際のデータ型ではありません)。生のバイトを CLR データ型に変換します。何かからビットを抽出したいときはいつでも、ビットマスクを考える必要があります。

特定の位置のビットが設定されているかどうかを確認するには、& 演算子を使用します。ビットごとの & は、両方のビットが設定されている場合にのみ真になります。たとえば、109 と 33 の 2 バイトがある場合、& の結果は次のようになります。

  0110 1101
& 0010 0001
-----------
  0010 0001

ビットが int に設定されているかどうかを確認したいだけの場合は、チェックしているビットのみが設定された数値 (つまり、1、2、4、8、16、32 など) を使用して & チェックします。結果がゼロでない場合。

List<int> BitPositions(uint input) {
    List<int> result = new List<int>();
    uint mask = 1;
    int position = 0;
    do {
        if (input & mask != 0) {
            result.Add(position);
        }
        mask <<= 1;
        position++;
    } while (mask != 0);

    return result;
}
于 2008-12-17T16:00:28.063 に答える
1

ブール値は使用しないでください。boolean は 2 つの値しかありませんが、実際には int のように 32 ビットを使用して格納されます。

EDIT:実際には、配列形式のブール値は4バイトではなくバイトにパックされます。

于 2008-12-17T15:46:23.473 に答える