inline bool has_zero_byte(unsigned int x)
{
return ((x - 0x01010101) & ~x & 0x80808080) != 0;
}
static const char table[16] = {
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };
inline int get_nth_zero(unsigned x)
{
unsigned int y;
y = (x & 0x7F7F7F7F) + 0x7F7F7F7F;
y = ~(y | x | 0x7F7F7F7F);
return table[y * 0x00204081 >> 28];
}
#define METHOD 1
#if METHOD == 1
size_t strlen_ex(char* s)
{
auto word = (unsigned int*)s;
while (!has_zero_byte(*word))
++word;
return ((char*) word) - s + get_nth_zero(*word);
}
#elif METHOD == 2
size_t strlen_ex(char* s)
{
auto word = (unsigned int*) s;
while (!has_zero_byte(*word++));
auto byte = (char*) word;
if (!byte[-4]) return byte - s - 4;
if (!byte[-3]) return byte - s - 3;
if (!byte[-2]) return byte - s - 2;
return byte - s - 1;
}
#endif
이컴에서는 5.4977 vs 1.9532 나오네여
사실 뭐 METHOD 1번이나 2번이나 비슷하게 나오는데 우물개구리님쪽에선 어떻게 나오나열?
이거 돌려본거예여
제껀 2:1 시궁창 속도죠 뭐
아 보면 METHOD를 1로 정의하냐 2로 정의하냐에 따라서 방법이 달라짐..
x86 기준 1번 5.5849 : 1.9573 2번 5.531 vs 2.1693
@우물개구리 : 고마워흉..
Release x86 : 1 - [ 114478:44187 (38%) ], 2 -[ 114505:40934 (35%) ]
저렇게 앤드연산 하는거 어떻게 아는거냐 뭘 공부하면 저런거도 알게됨? - DCW
@123 : bit twiddle 같은걸로 검색해보면 많이 나옴.. 저건 일종의 테크닉임..
공부를 해서 아는게 아니라;;
ㄱㅅ - DCW