시작단계. Mers 가 이미지로 발라 놓은 코드 따라 치기
static unsigned long convert(wchar_t ch)
{
unsigned long ret;
if( ch > 0x7F )
{
if( ch > 0x7FF )
{
if( ch > 0xFFFF )
{
ret = ( ch >> 18 ) | 0xF0;
ret <<= 8;
ret |= ( ( ch >> 12 ) & 0x3F ) | 0x80;
ret <<= 8;
ret |= ( ( ch >> 6 ) & 0x3F ) | 0x80;
ret <<= 8;
ret |= ( ch & 0x3F ) | 0x80;
}
else
{
ret = ( ch >> 12 ) | 0xE0;
ret <<= 8;
ret |= ( ( ch >> 6 ) & 0x3F ) | 0x80;
ret <<= 8;
ret |= ( ch & 0x3F ) | 0x80;
}
}
else
{
ret = ( ch >> 6 ) | 0xC0;
ret <<= 8;
ret |= ( ch & 0x3F ) | 0x80;
}
}
else ret = ch;
return ret;
}
1단계. 각 케이스별 상수 OR 연산을 모아본 후, 쉬프트와 & 연산을 합친다.
static unsigned long convert_1( wchar_t ch )
{
unsigned long ret;
if( ch > 0xFFFF )
{
ret = ( ( ch << 6 ) & 0x3F000000 ) |
( ( ch << 4 ) & 0x003F0000 ) |
( ( ch << 2 ) & 0x00003F00 ) |
( ( ch << 0 ) & 0x0000003F ) |
0xF0808080;
}
else if ( ch > 0x7FF )
{
ret = ( ( ch << 4 ) & 0x003F0000 ) |
( ( ch << 2 ) & 0x00003F00 ) |
( ( ch << 0 ) & 0x0000003F ) |
0x00E08080;
}
else if ( ch > 0x7F )
{
ret = ( ( ch << 2 ) & 0x00003F00 ) |
( ( ch << 0 ) & 0x0000003F ) |
0x0000C080;
}
else ret = ch;
return ret;
}
2단계. 공통 코드를 한 단계씩 앞으로 빼 내자. (ㅅㅅㅅ 한테 잔소리 들을것 같으니까 괄호도 빼자)
static unsigned long to_utf8( wchar_t ch )
{
if( ch < 0x80 ) return ch;
unsigned long ret = ch & 0x3F | ch << 2 & 0x3F00;
if( ch < 0x800 ) return ret | 0xC080;
ret |= ch << 4 & 0x3F0000;
if( ch < 0x10000 ) return ret | 0xE08080;
return ret | ch << 6 & 0x3F000000 | 0xF0808080;
}
중간과정좀 알려주세요. 저렇게 보면 뭐지 모르겠음
알써 올려줄게
ㄳㄳ
우왕
이래서 띄어쓰기랑 칸 맞추는게 중요한거여 룰이 잘 보이거든.
와 ㅋㅋ
컴파일러 최적화 따위 못써먹음.
더 이상 컴파일러 최적화가 안되네, 대단하심
무슨 압축기로 찍어서 포갠거같네 ㅋㅋㅋ 팍팍주네
ㅁㅊㄷㅁㅊㅇ
그럼 코센데 낄낄.
별것도 아니건 가지고 왕고하네 나 참
ㄴ 별거인거 좀 들고와 볼래?