16 進数の前に 0x を付けるなど、C# でバイナリ リテラルを記述する方法はありますか? 0b は機能しません。
そうでない場合、それを行う簡単な方法は何ですか? ある種の文字列変換?
C# 7.0 にはバイナリ リテラルが含まれるようになりました。これは素晴らしいことです。
[Flags]
enum Days
{
None = 0,
Sunday = 0b0000001,
Monday = 0b0000010, // 2
Tuesday = 0b0000100, // 4
Wednesday = 0b0001000, // 8
Thursday = 0b0010000, // 16
Friday = 0b0100000, // etc.
Saturday = 0b1000000,
Weekend = Saturday | Sunday,
Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
}
トピックは、列挙型でビットベースのフラグ値を宣言することに変わったように見えるので、この種の便利なトリックを指摘する価値があると思いました。左シフト演算子 ( <<
) を使用すると、ビットを特定のバイナリ位置にプッシュできます。これを、同じクラス内の他の値に関して列挙値を宣言する機能と組み合わせると、ビット フラグ列挙型の非常に読みやすい宣言構文が得られます。
[Flags]
enum Days
{
None = 0,
Sunday = 1,
Monday = 1 << 1, // 2
Tuesday = 1 << 2, // 4
Wednesday = 1 << 3, // 8
Thursday = 1 << 4, // 16
Friday = 1 << 5, // etc.
Saturday = 1 << 6,
Weekend = Saturday | Sunday,
Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
}
残念ながら、直接整数と16進数のみです(ECMA 334v4):
9.4.4.2 整数リテラル整数リテラルは、int、uint、long、および ulong 型の値を書き込むために使用されます。整数リテラルには、10 進数と 16 進数の 2 つの形式があります。
解析するには、次を使用できます。
int i = Convert.ToInt32("01101101", 2);
求める値を含む準リテラル、定数をいつでも作成できます。
const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);
それらを頻繁に使用する場合は、再利用のために静的クラスにラップできます。
ただし、ビットに関連するセマンティクスがある場合 (コンパイル時に既知) は、少しトピックから外れていますが、代わりに Enum を使用することをお勧めします。
enum Flags
{
First = 0,
Second = 1,
Third = 2,
SecondAndThird = 3
}
// later ...
Debug.Assert((Flags.Second | Flags.Third) == Flags.SecondAndThird);
.NET Compiler Platform ("Roslyn")の言語機能の実装状況を見ると、C# 6.0 でこれが計画された機能であることが明確にわかります。そのため、次のリリースでは通常の方法でそれを行うことができます。
string sTable="static class BinaryTable\r\n{";
string stemp = "";
for (int i = 0; i < 256; i++)
{
stemp = System.Convert.ToString(i, 2);
while(stemp.Length<8) stemp = "0" + stemp;
sTable += "\tconst char nb" + stemp + "=" + i.ToString() + ";\r\n";
}
sTable += "}";
Clipboard.Clear();
Clipboard.SetText ( sTable);
MessageBox.Show(sTable);
これを使用して、8ビットバイナリの場合、これを使用して静的クラスを作成し、それをクリップボードに入れます。次に、プロジェクトに貼り付けられ、使用セクションに追加されるため、nb001010 を持つものはすべてテーブルから取り出されます。最も静的ではありませんが、それでも...私は多くのPICグラフィックコーディングにC#を使用し、Hi-Tech Cで0b101010を多く使用しています
--コード出力のサンプル--
static class BinaryTable
{ const char nb00000000=0;
const char nb00000001=1;
const char nb00000010=2;
const char nb00000011=3;
const char nb00000100=4;
//etc, etc, etc, etc, etc, etc, etc,
}
:-) ニール
Literal を使用することはできませんが、BitConverterも解決策になるのでしょうか?
文字列の解析ソリューションは最も人気がありますが、私は好きではありません。
ある種のビットフィールドまたはバイナリマスクが必要な場合は、次のように記述します
長いビットマスク = 1011001;
以降
int bit5 = BitField.GetBit(bitMask, 5);
または
bool flag5 = BitField.GetFlag(bitMask, 5);`
BitField クラスの場所
public static class BitField
{
public static int GetBit(int bitField, int index)
{
return (bitField / (int)Math.Pow(10, index)) % 10;
}
public static bool GetFlag(int bitField, int index)
{
return GetBit(bitField, index) == 1;
}
}
基本的に、答えは NO だと思います。簡単な方法はありません。10 進数または 16 進数の定数を使用してください。それらは単純で明確です。@RoyTinkersの回答も良いです-コメントを使用してください。
int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8; // 000000001000
ここでの他の回答は、いくつかの有用な作業を示していますが、単純な回答よりも優れているとは思いません。C# 言語の設計者は、おそらく '0b' プレフィックスは不要であると考えていました。HEX はバイナリに変換するのが簡単で、ほとんどのプログラマーは、とにかく 0 ~ 8 に相当する DEC を知っている必要があります。
また、デバッガーで値を調べると、HEX または DEC が表示されます。