[C#] C # 이진 리터럴

16 진수 앞에 0x를 붙이는 것과 같이 C #에서 이진 리터럴을 작성하는 방법이 있습니까? 0b가 작동하지 않습니다.

그렇지 않은 경우 쉬운 방법은 무엇입니까? 어떤 종류의 문자열 변환?



답변

C # 7.0이진 리터럴 (및 밑줄 문자를 통한 선택적 숫자 구분 기호)을 지원합니다.

예를 들면 :

int myValue = 0b0010_0110_0000_0011;

Roslyn GitHub 페이지 에서 자세한 정보를 확인할 수도 있습니다 .


답변

최신 정보

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 진수의 두 가지 가능한 형식이 있습니다.

파싱하려면 다음을 사용할 수 있습니다.

int i = Convert.ToInt32("01101101", 2);


답변

열거 형의 비트 플래그에 대한 @StriplingWarrior의 답변에 덧붙여, 비트 시프트를 통해 위쪽으로 카운트하기 위해 16 진수로 사용할 수있는 쉬운 규칙이 있습니다. 1-2-4-8 순서를 사용하여 한 열을 왼쪽으로 이동 한 후 반복하십시오.

[Flags]
enum Scenery
{
  Trees   = 0x001, // 000000000001
  Grass   = 0x002, // 000000000010
  Flowers = 0x004, // 000000000100
  Cactus  = 0x008, // 000000001000
  Birds   = 0x010, // 000000010000
  Bushes  = 0x020, // 000000100000
  Shrubs  = 0x040, // 000001000000
  Trails  = 0x080, // 000010000000
  Ferns   = 0x100, // 000100000000
  Rocks   = 0x200, // 001000000000
  Animals = 0x400, // 010000000000
  Moss    = 0x800, // 100000000000
}

오른쪽 열부터 스캔하여 1-2-4-8 (shift) 1-2-4-8 (shift) 패턴을 확인하십시오.


원래 질문에 대답하기 위해 16 진수를 사용하는 @Sahuagin의 제안을 두 번째로하십시오. 이 문제를 우려하기에 충분한 이진수로 자주 작업하는 경우 16 진수를 익힐 가치가 있습니다.

소스 코드에서 이진수를 볼 필요가 있다면 위와 같이 이진 리터럴로 주석을 추가하는 것이 좋습니다.


답변

다음과 같은 값을 포함하는 준 리터럴 상수를 항상 만들 수 있습니다.

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 컴파일러 플랫폼 ( “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, 
}

🙂 닐