C\#바 이 너 리 전환 에 대한 사고
최근 에 재 미 있 는 바 이 너 리 전환 문제 에 부 딪 혔 습 니 다.일부 어린이 신발 은 잘 알 고 있 습 니 다.일부 어린이 신발 은 만 나 보지 도 않 고 모 르 는 경우 도 있 습 니 다.여기 서 우 리 는 바 이 너 리 전환 에 따 른 문 제 를 깊이 공부 하 겠 습 니 다.
질문
현재 우리 가 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
public sealed class CharEnumerator : IEnumerator, ICloneable, IEnumerator<char>, IDisposable
{......}
다음은 용량 이 4 인 배열 을 초기 화 하 는 것 이다.왜 여 기 는 4 일 까?여기 서 저 는 최적화 라 고 할 수 없다 고 생각 합 니 다.실현 자의 머리 를 두 드 리 는 생각 이 라 기보 다 는 저울질 이나 고려 라 고 이해 하 는 경향 이 있 습 니 다.이 지점 으로 넘 어가 면 반드시 이 진 으로 전환 하 는 배열 이 라 고 설명 합 니 다.예 를 들 어 상기 충전 을 한 후에 길이 가 4 입 니 다.그 다음 에 더 이상 말 할 필요 가 없습니다.모든 문자 배열 을 옮 겨 다 니 며 모든 문자열 을 배열 에 추가 하 는 것 입 니 다.배열 의 길이 와 변수 값(num)이 같 을 때 까지 한 번 에 복사 하고 마지막 으로 배열 요소 와 변수 num 을 배열 요소 에 할당 하 는 수량(count)입 니 다.자,이렇게 많이 설명 하 셨 으 니 문제 가 생 겼 습 니 다.과연 누구의 성능 이 더 좋 을 까요?ToCharArray 방법 은 밑 에 포인터 조작 을 사용 하여 문자 배열 로 전환 하 는 것 을 실현 합 니 다.ToArray 방법 은 string 을 이용 하여 ICollection
총결산
본 고 는 바 이 너 리 데 이 터 를 바 꾸 는 데 발생 하 는 개인 적 인 사 고 를 상세 하 게 설명 했다.문자열 을 문자 배열 로 바 꿀 때 방법 이름 의 의 미 를 통 해 ToCharArray 방법 을 직접 사용 할 수 있 지만 하필 문자열 의 ToArray 방법 을 제공 했다.그 본질은 문자 배열 에 대한 확장 방법 이다.소스 코드 에 대해 잘 모 르 면...도대체 어떤 것 을 사용 해 야 하 는 지,성능 측면 에서 볼 때 ToCharArray 방법 이 ToArray 방법 보다 좋 은 지,최종 적 으로 어떤 것 을 사용 해 야 하 는 지 는 네가 결정 해라.
C\#바 이 너 리 전환 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#바 이 너 리 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.