12

私はC#(および一般的にはC)に非常に慣れていません.IOデバイスのポートの8つの入力ピンの状態を表す外部ソースから返されたバイト値を取得しているため、値0を取得していますポートに存在するバイナリ パターンを表す -255。

個々のビットを取り除き、bool 変数として設定するにはどうすればよいので、次のようにします。

if (inputBuffer[1] == 1)
{
     IO.Input0 = true;
     IO.Input1 = false;
     IO.Input2 = false;
     IO.Input3 = false;
     IO.Input4 = false;
     IO.Input5 = false;
     IO.Input6 = false;
     IO.Input7 = false;
}    

私はおそらく私が達成しようとしていることを過度に説明していますが、これは非常に非現実的ですが、これが最良の例であると考えました.0〜255のバイト値に基づいて変数を設定するにはどうすればよいでしょうか.

4

6 に答える 6

12

ビットごとの AND ( &) を使用します。Input0最下位ビットを表すと仮定します。

IO.Input0 = (inputBuffer & 0x01) == 0x01;
IO.Input1 = (inputBuffer & 0x02) == 0x02;
IO.Input2 = (inputBuffer & 0x04) == 0x04;
IO.Input3 = (inputBuffer & 0x08) == 0x08;
IO.Input4 = (inputBuffer & 0x10) == 0x10;
IO.Input5 = (inputBuffer & 0x20) == 0x20;
IO.Input6 = (inputBuffer & 0x40) == 0x40;
IO.Input7 = (inputBuffer & 0x80) == 0x80;

次のような拡張メソッドを実装することもできます。

public static bool IsBitSet(this byte b, int bit)
{
    if(bit < 0 || bit > 7)
        throw new ArgumentOutOfRangeException("bit must be between 0 and 7");

    byte bitToCheck = (byte)(0x01 << bit);

    return (b & bitToCheck) == bitToCheck;
}

次に、次のように呼び出すことができます。

IO.Input4 = inputBuffer.IsBitSet(4);
于 2013-04-08T08:51:24.237 に答える
4

これを理解するには、ビットマスクと&-operator を使用します

byte b = 100;

if(b&1 == 1) { } //bit 1 is set
if(b&2 == 2) { } //bit 2 is set
if(b&4 == 4) { } //bit 3 is set
...
于 2013-04-08T08:51:47.990 に答える
2

データがバイト形式で渡され、各ビットがマスクされている場合は、そのままにしておきます。それらを別の型に変換する必要はありません。無駄な作業になります。正しいビットを取得するには、ビットマスクパターンを使用してください

private bool GetMaskedBit(var inputBuffer , int mask)
{
    return ((inputBuffer & mask) != 0);
}

このようにして、バッファと必要なビットを解析すると、ビットが設定されているかどうかが返されます。

于 2013-04-08T09:00:48.783 に答える
2

BitArrayクラスを使用できます。

var bitArray = new BitArray(inputBuffer);
IO.Input1 = bitArray[byteIndex * 8 + 1];

または

var bitArray = new BitArray(new byte[] { inputBuffer[1] });
IO.Input1 = bitArray[1];

ブール値のコレクションとして反復し、コレクション全体に対してビット単位の操作を実行することもできます。

ここで提供されている他のオプション (割り当てのコスト) ほどパフォーマンスが優れていないことは明らかですが、ビット計算用の非常に優れた API を提供します。

于 2013-04-08T09:16:11.590 に答える
2

自己記述クラスが役立つと思います。クラスには 8 ビットを含めることができ、コンストラクターは 1 バイトを受け取ります。コンストラクターでは、単一のビットを計算できます。

public class myByte
{
    bool    Input0 = false;
    bool    Input1 = false;
    bool    Input2 = false;
    bool    Input3 = false;
    bool    Input4 = false;
    bool    Input5 = false;
    bool    Input6 = false;
    bool    Input7 = false;        

    public myByte(byte b)
    {
        //written by Ic.
        Input0 = b & 0x01 == 0x01;
        Input1 = b & 0x02 == 0x02;
        Input2 = b & 0x04 == 0x04;
        Input3 = b & 0x08 == 0x08;
        Input4 = b & 0x10 == 0x10;
        Input5 = b & 0x20 == 0x20;
        Input6 = b & 0x40 == 0x40;
        Input7 = b & 0x80 == 0x80;
    }
    ... //getter setter ...
}
于 2013-04-08T08:57:34.010 に答える