- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <inttypes.h>
union Str
{
uint64_t a;
char str[8];
};
int main(void)
{
union Str str;
memcpy( &str.str, "12345678", sizeof(str.a));
str.a = ((str.a & 0x0F000F000F000F00)>>8) +
((str.a & 0x000F000F000F000F)*10);
str.a = 1000000 * ((str.a >> 0 ) & 0xFF) +
10000 * ((str.a >> 16) & 0xFF) +
100 * ((str.a >> 32) & 0xFF) +
((str.a >> 48) & 0xFF);
//little-endian only. Можно переделать под big-endian
printf("%"PRIu64, str.a);
return 0;
}
Байтоебское преобразование строки из 8 цифр(в виде ascii символов) в число
j123123 21.07.2013 18:15 # 0
j123123 22.07.2013 04:21 # +2
Маску можно не делать
bormand 22.07.2013 06:53 # +6
someone 21.07.2013 18:31 # 0
"Правильно" это делать - через указатели (преобразовать char* в uint64_t*). Правда, UB это не будет только в случае совпадения требований по alignment'у.
100% переносимый вариант - вручную сделать нужное число из восьми байт с помощью << и I.
bormand 21.07.2013 18:38 # +1
http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html
> 100% переносимый вариант - вручную сделать нужное число из восьми байт с помощью << и I.
+1. Заодно уйдут проблемы с тупоконечниками.
someone 21.07.2013 18:40 # 0
j123123 07.04.2014 15:35 # 0
j123123 07.04.2014 15:43 # 0
j123123 07.04.2014 15:50 # +1
memcpy лучше, компиляторы его вызовы хорошо оптимизируют
bormand 21.07.2013 18:56 # +4