C\#바 이 너 리 전환 에 대한 사고

6225 단어 c#바꾸다2 진법
머리말
최근 에 재 미 있 는 바 이 너 리 전환 문제 에 부 딪 혔 습 니 다.일부 어린이 신발 은 잘 알 고 있 습 니 다.일부 어린이 신발 은 만 나 보지 도 않 고 모 르 는 경우 도 있 습 니 다.여기 서 우 리 는 바 이 너 리 전환 에 따 른 문 제 를 깊이 공부 하 겠 습 니 다.
질문
현재 우리 가 int 형식의 데 이 터 를 가지 고 있다 고 가정 하면 범위 구간 은 0-15 사이 로 잠 정적 으로 정 해 져 있 습 니 다.우 리 는 그것 을 2 진법 으로 바 꾼 다음 에 2 진법 의 한 분 한 분 을 가 져 와 야 합 니 다.4 자리 가 부족 하면 0 으로 채 워 야 합 니 다.간단 한 것 같 습 니 다.그 렇 죠?C\#내 장 된 API 를 통 해 이 수 요 를 달성 할 수 있 습 니 다.다음 과 같 습 니 다.

var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();
위 에서 숫자 7 을 바 이 너 리 를 포함 하 는 문자열 배열 형식 으로 바 꾸 었 습 니 다.7 은 바 이 너 리 를 바 꾸 고 4 자리 가 안 되 는 0 으로 채 우 면(0111)바 이 너 리 문자열 배열 을 색인 으로 가 져 옵 니 다.결 과 는 0 으로 인쇄 해 야 합 니 다.맞 습 니까?

var zerobit = binary[0];
Console.WriteLine(zerobit);

아무런 문제 가 없 는 것 같 습 니 다.이것 은 콘 솔 에서 인쇄 하 는 것 입 니 다.이 데 이 터 를 엑셀 로 내 보 내 면 0 이나 1 이 아 닌 48 이나 49 일 수 있 습 니 다.다음 과 같 기 때 문 입 니 다.

디 버 깅 을 통 해 알 수 있 듯 이 실제 문자 0 에 48 이 있 습 니 다.이 48 은 실제 문자 0 의 ASCII 코드 이 고 문자 1 의 ASCII 코드 는 49 입 니 다.다음 코드 를 통 해 증명 할 수 있 습 니 다.

foreach (var b in System.Text.Encoding.UTF8.GetBytes(binary))
{
 Console.WriteLine(b.ToString());
}


저 희 는 대응 하 는 문자 배열 의 색인 데 이 터 를 다음 과 같이 ToString 변환 하면 데 이 터 를 내 보 낼 때 발생 할 수 있 는 문 제 를 피 할 수 있 습 니 다.

var zerobit = binary[0];
Console.WriteLine(zerobit.ToString());
질문
우리 가 문자 배열 로 전환 할 때 두 가지 방식 이 있 습 니 다.상기 ToArray 방법 도 사용 할 수 있 고 ToCharArray 방법 으로 도 실현 할 수 있 습 니 다.다음 과 같 습 니 다.그러면 어떤 방법 이 더 좋 을까요?

var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();

var binary1 = Convert.ToString(7, 2).PadLeft(4, '0').ToCharArray();
이때 이 두 가지 방법의 성능 이 좋 고 나 쁨 을 비교 하면 해당 하 는 소스 코드 의 실현 만 볼 수 있다.먼저 ToCharArray 방법 을 살 펴 보 자.다음 과 같다.

public unsafe char[] ToCharArray()
{
 if (Length == 0)
 {
  return Array.Empty<char>();
 }
 char[] array = new char[Length];
 fixed (char* smem = &_firstChar)
 {
  fixed (char* dmem = &array[0])
  {
   wstrcpy(dmem, smem, Length);
  }
 }
 return array;
}

internal unsafe static void wstrcpy(char* dmem, char* smem, int charCount)
{
 Buffer.Memmove((byte*)dmem, (byte*)smem, (uint)(charCount * 2));
}
상기 ToCharArray 코드 의 양 이 많 지 않 습 니 다.ToArray 방법 이 실현 되 는 지 살 펴 보 겠 습 니 다.다음 과 같 습 니 다.

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
 if (source == null)
 {
  throw Error.ArgumentNull("source");
 }
 return new Buffer<TSource>(source).ToArray();
}
상술 한 것 은 확장 방법 을 썼 을 뿐 입 니 다.우 리 는 Buffer 류 의 구체 적 인 실현 을 계속 내 려 다 보 았 습 니 다.다음 과 같 습 니 다.

internal Buffer(IEnumerable<TElement> source)
{
 TElement[] array = null;
 int num = 0;
 ICollection<TElement> collection = source as ICollection<TElement>;
 if (collection != null)
 {
  num = collection.Count;
  if (num > 0)
  {
   array = new TElement[num];
   collection.CopyTo(array, 0);
  }
 }
 else
 {
  foreach (TElement item in source)
  {
   if (array == null)
   {
    array = new TElement[4];
   }
   else if (array.Length == num)
   {
    TElement[] array2 = new TElement[checked(num * 2)];
    Array.Copy(array, 0, array2, 0, num);
    array = array2;
   }
   array[num] = item;
   num++;
  }
 }
 items = array;
 count = num;
}
코드 양 적 으로 볼 때 ToArray 방법 이 약간 복잡 하 다 고 생각 하기 때문에 우 리 는 ToCharArray 를 사용 하 는 것 이 좋 습 니 다.제 가 이렇게 대충 이 글 을 끝내 면 반드시 뿌 릴 것 입 니 다.원래 본전 으로 돌아 가면 우 리 는 한 걸음 한 걸음 분석 합 니 다.만약 에 위 에서 약간의 최 적 화 를 했다 면 먼저 매개 변수 가 집합 인터페이스 에 속 하 는 지 판단 할 것 입 니 다.만약 에 복 제 를 통 해 배열 형식 으로 전환 할 것 입 니 다.그러나 우 리 는 문자열 이 ICollection인 터 페 이 스 를 실현 하지 못 했 을 것 이라는 것 을 알 고 있 습 니 다.그래서 다른 조건 으로 나 누 었 습 니 다.그러나 어떤 어린이 신발 은 의문 이 있 을 수 있 습 니 다.이때 왜 옮 겨 다 닐 수 있 습그것 은 문자 에 대한 IEnumerable인 터 페 이 스 를 실 현 했 기 때문에 다음 과 같이 옮 겨 다 닐 수 있 습 니 다.

public sealed class CharEnumerator : IEnumerator, ICloneable, IEnumerator<char>, IDisposable
{......}
다음은 용량 이 4 인 배열 을 초기 화 하 는 것 이다.왜 여 기 는 4 일 까?여기 서 저 는 최적화 라 고 할 수 없다 고 생각 합 니 다.실현 자의 머리 를 두 드 리 는 생각 이 라 기보 다 는 저울질 이나 고려 라 고 이해 하 는 경향 이 있 습 니 다.이 지점 으로 넘 어가 면 반드시 이 진 으로 전환 하 는 배열 이 라 고 설명 합 니 다.예 를 들 어 상기 충전 을 한 후에 길이 가 4 입 니 다.그 다음 에 더 이상 말 할 필요 가 없습니다.모든 문자 배열 을 옮 겨 다 니 며 모든 문자열 을 배열 에 추가 하 는 것 입 니 다.배열 의 길이 와 변수 값(num)이 같 을 때 까지 한 번 에 복사 하고 마지막 으로 배열 요소 와 변수 num 을 배열 요소 에 할당 하 는 수량(count)입 니 다.
자,이렇게 많이 설명 하 셨 으 니 문제 가 생 겼 습 니 다.과연 누구의 성능 이 더 좋 을 까요?ToCharArray 방법 은 밑 에 포인터 조작 을 사용 하여 문자 배열 로 전환 하 는 것 을 실현 합 니 다.ToArray 방법 은 string 을 이용 하여 ICollection인 터 페 이 스 를 실현 하지 못 했 습 니 다.즉,문자열 에 있 는 문자 배열 의 길 이 를 전혀 모 르 기 때문에 비효 율 적 으로 옮 겨 다 니 는 방식 으로 바 꿀 수 밖 에 없습니다.우 리 는 중간 버퍼 방식(즉,상기 사례 화 배열 을 통 해 교량 으로 최종 적 으로 복사)을 통 해 이 루어 진다 고 볼 수 있다.이 를 통 해 알 수 있 듯 이 문자열 을 문자 배열 로 바 꿀 때 ToArray 가 아 닌 ToCharArray 방법 을 사용 해 야 합 니 다.ToCharArray 의 성능 이 ToArray 방법 보다 좋 습 니 다.문 자 를 배열 로 바 꿀 때 ToCharArray 방법 만 제공 하면 되 지 않 겠 습 니까?왜 ToArray 방법 을 제공 하여 오해 하기 쉬 운 지 생각 합 니 다.그 장면 에 또 다른 것 이 있 습 니까?
총결산
본 고 는 바 이 너 리 데 이 터 를 바 꾸 는 데 발생 하 는 개인 적 인 사 고 를 상세 하 게 설명 했다.문자열 을 문자 배열 로 바 꿀 때 방법 이름 의 의 미 를 통 해 ToCharArray 방법 을 직접 사용 할 수 있 지만 하필 문자열 의 ToArray 방법 을 제공 했다.그 본질은 문자 배열 에 대한 확장 방법 이다.소스 코드 에 대해 잘 모 르 면...도대체 어떤 것 을 사용 해 야 하 는 지,성능 측면 에서 볼 때 ToCharArray 방법 이 ToArray 방법 보다 좋 은 지,최종 적 으로 어떤 것 을 사용 해 야 하 는 지 는 네가 결정 해라.
C\#바 이 너 리 전환 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#바 이 너 리 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기