LINUX.ORG.RU

История изменений

Исправление 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;
}