質問
次のような古いコードがいくつかあります:
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のいずれかが含まれています。ここに何が欠けていますか?間違った演算子を使用していますか?
解決
問題は、最初の関数ではbits [0]が最下位ビットを返しますが、2番目の関数は最上位ビットを返すことです。 2番目の関数を変更して最下位ビットを取得するには:
private int ParseByte(byte theByte)
{
return theByte & 00000001;
}
最初の関数を変更して最上位ビットを返すには、ビット[0]ではなく、ビット[7]を使用する必要があります。
他のヒント
最初のスニペットと同等の機能は次のとおりです。
return theByte & 1 == 1
2番目のスニペットでは、最も重要なビットはchechikで、最初のスニペットでは最も重要ではありませんでした。
intまたはstringを返しますか?とにかく-モジュロを使用できます:
return theByte % 2 == 0 ? "0" : "1"
OK、編集しました... intを返したい
シフト操作への言葉:<!> lt; <!> lt;を使用する必要があります。 <!> gt; <!> gt;の代わりに。しかし、これは(intではなくbyteにキャストした場合)0または128を返し、0または1ではありません。したがって、2番目のソリューションを次のように書き換えることができます。
return (byte)(theByte << 7) == 128 ? 1 : 0;
ただし、他の回答にはこれよりも優れたソリューションが含まれています。
おそらく最初の関数はビット[7]をチェックすべきでしょうか?
2進数に余分なゼロがあります(それぞれに9桁あります)。それは単なるタイプミスだと思います。
注文を正しく行っていますか?バイナリは伝統的に右から左に記述され、他のほとんどの番号付けシステムのように左から右ではありません。示したバイナリ番号がフォーマットされたプロパティである場合(つまり、10000000
は実際には数値128
であり、数値1
ではないことを意味します)、最初のコードスニペットは機能せず、2番目は機能します。逆方向に書いている場合(theByte & 1
は&
ではなく<=>を意味します)、ビットシフトする必要さえありません。 AND(1(<=>))。
実際には、アプローチに関係なく、ビット単位のAND(<=>演算子)の方が適切なようです。最初の関数は機能し、2番目の機能は機能しないことを考えると、上記のように、数字を逆方向に書き、1とANDする必要があると仮定しています。
1st最初の関数は、intではなく文字列を返そうとするため機能しません。
しかし、あなたが望むのはこれです:
private static int ParseByte(byte theByte)
{
return theByte & 1;
}
ただし、これも必要な場合があります。
private static string ParseByteB(byte theByte)
{
return (theByte & 1).ToString();
}