1

次のような古いコードがあります。

private int ParseByte(byte theByte)
{
        byte[] bytes = new byte[1];
        bytes[0] = theByte;
        BitArray bits = new BitArray(bytes);

        if (bits[0])
            return 1;
        else
            return 0;
}

長いので、次のように切り詰めることができると考えました。

private int ParseByte(byte theByte)
{
         return theByte >> 7;
}

しかし、最初の関数と同じ値が得られません。このバイトには 00000000 または 10000000 が含まれています。間違った演算子を使用していませんか?

4

7 に答える 7

4

問題は、最初の関数で bits[0] が最下位ビットを返しますが、2 番目の関数が最上位ビットを返すことです。最下位ビットを取得するように 2 番目の関数を変更するには、次のようにします。

private int ParseByte(byte theByte)
{
    return theByte & 00000001;
}

最上位ビットを返すように最初の関数を変更するには、bits[0] ではなく、bits[7] を使用する必要があります。

于 2009-06-16T15:39:45.613 に答える
3

最初のスニペットと同等の機能は次のとおりです。

return theByte & 1 == 1

2 番目のスニペットでは最も重要なビットをチェックし、最初のスニペットでは最も重要でないビットをチェックしました。

于 2009-06-16T15:43:10.800 に答える
1

int または string を返しますか? とにかく-モジュロを使用できます:

return theByte % 2 == 0 ? "0" : "1"

OK、編集しました...そしてintを返したいです

シフト操作について一言: >> の代わりに << を使用する必要があります。しかし、これは (int ではなく byte にキャストすると) 0 または 128 を返し、0 または 1 ではありません。したがって、2 番目のソリューションを次のように書き直すことができます。

return (byte)(theByte << 7) == 128 ? 1 : 0;

しかし、他の回答には、これよりも本当に優れたソリューションが含まれています。

于 2009-06-16T15:43:23.843 に答える
0

2 進数に余分なゼロがあります (それぞれに 9 桁あります)。それは単なるタイプミスだと思います。

正しく注文できていますか?バイナリは、他のほとんどの番号付けシステムのように左から右ではなく、伝統的に右から左に記述されます。あなたが示した2進数がプロパティフォーマットされている場合(つまり、10000000実際には数値であり、数値128ではありません1)、最初のコードスニペットは機能せず、2番目のコードスニペットは機能するはずです。逆に書いている場合 (つまり10000000is 1、 not 128)、ビットシフトする必要さえありません。1 ( ) で AND するだけtheByte & 1です。

実際、アプローチに関係なく、ビットごとの AND (&演算子) の方が適しているようです。最初の関数が機能し、2 番目の関数が機能しないことを考えると、数値を逆に書き、上記のように 1 と AND する必要があると仮定します。

于 2009-06-16T15:38:28.627 に答える
0

Microsoft のサイトのユーザーによると、BitArray は内部的にビットをビッグ エンディアンで Int32s にビット順に格納します。それが問題を引き起こす可能性があります。解決策と詳細については、リンクにアクセスしてください。

于 2009-06-16T15:38:46.847 に答える
0

おそらく、最初の関数はビット[7]をチェックする必要がありますか?

于 2009-06-16T15:34:42.783 に答える
0

1st 最初の関数は、int ではなく文字列を返そうとするため、機能しません。

しかし、あなたが望むかもしれないのはこれです:

    private static int ParseByte(byte theByte)
    {
        return theByte & 1;
    }

ただし、これも必要になる場合があります。

    private static string ParseByteB(byte theByte)
    {
        return (theByte & 1).ToString();
    }
于 2009-06-16T15:43:20.053 に答える