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,
}
🙂 닐