История изменений
Исправление SZT, (текущая версия) :
На вот держи два варианта. Выкрвыривает по 8 цифр и преобразовывает в число от 0 до 99999999. Проверку «является ли переданная фигня числом» оно не проводит. Всегда лопает по 8 цифр, так что обязательно должны быть ведущие нули. Что из них быстрее я не проверял
#include <stdint.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>
uint64_t parse1(char *str)
{
uint64_t a;
memcpy( &a, str, 8);
a = ((a & 0x0F000F000F000F00)>>8) +
((a & 0x000F000F000F000F)*10);
a = 1000000 * ((a >> 0 ) & 0xFF) +
10000 * ((a >> 16) & 0xFF) +
100 * ((a >> 32) & 0xFF) +
((a >> 48) & 0xFF);
return a;
}
uint64_t parse2(char *str)
{
uint64_t a;
memcpy( &a, str, 8);
a = (a & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
a = (a & 0x00FF00FF00FF00FF) * 6553601 >> 16;
a = (a & 0x0000FFFF0000FFFF) * 42949672960001 >> 32;
return a;
}
int main(void)
{
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("999999999"), parse2("999999999"));
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("000000000"), parse2("000000000"));
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("123456789"), parse2("123456789"));
return 0;
}
Исходная версия SZT, :
На вот держи два варианта. Выкрвыривает по 8 цифр и преобразовывает в число от 0 до 99999999. Проверку «является ли переданная фигня числом» оно не проводит. Всегда лопает по 8 цифр, так что обязательно должны быть ведущие нули. Что из них быстрее я не проверял
#include <stdint.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>
uint64_t parse1(char *str)
{
uint64_t a;
memcpy( &a, str, 8);
a = ((a & 0x0F000F000F000F00)>>8) +
((a & 0x000F000F000F000F)*10);
a = 1000000 * ((a >> 0 ) & 0xFF) +
10000 * ((a >> 16) & 0xFF) +
100 * ((a >> 32) & 0xFF) +
((a >> 48) & 0xFF);
return a;
}
uint64_t parse2(char *str)
{
uint64_t a;
memcpy( &a, str, 8);
a = (a & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
a = (a & 0x00FF00FF00FF00FF) * 6553601 >> 16;
a = (a & 0x0000FFFF0000FFFF) * 42949672960001 >> 32;
return a;
}
int main(void) {
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("999999999"), parse2("999999999"));
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("000000000"), parse2("000000000"));
printf("%" PRIu64 " ""%" PRIu64 "\n", parse1("123456789"), parse2("123456789"));
return 0;
}