C言語関係掲示板

過去ログ

No.585.intの配列を結合し、64bitの数値を10進数で出力したい

[戻る] [ホームページ]
No.5472

int 2つを結合し、10進数として出力したい
投稿者---うさぎ(2003/03/05 22:07:54)


初投稿のうさぎです。

32bitのintの配列2つを結合し、結果の最大64bitの数値を
10進数で出力したいのですが、方法をご存知の方がいらっ
しゃいましたら、教えてください。

例えば、配列の0番目の要素をLSB、1番目の要素をMSBとして

int in_data[0] ←2
int in_data[1] ←1

を結合した

0x100000002 (0x0000000100000002)

を、10進数として

4294967298

と出力したいのです。

long long型に代入する方法を試してみましたが、
上記の型は使用できませんでした。

すみませんが、よろしくお願いします。

No.5477

Re:int 2つを結合し、10進数として出力したい
投稿者---かずま(2003/03/05 23:40:16)


> 32bitのintの配列2つを結合し、結果の最大64bitの数値を
> 10進数で出力したいのですが、方法をご存知の方がいらっ
> しゃいましたら、教えてください。
#include <stdio.h>

#define NDIGIT  19

static void add(char *s, int x)
{
    int i;

    for (i = 0; i < NDIGIT; i++)
        if (x += s[i]<<4)  s[i] = x%10,  x /= 10;
}

void print_ll(long *x)
{
    char s[NDIGIT] = { 0 }, buf[NDIGIT+2], *p = buf;
    long a = x[1], b = x[0];
    int  i;

    if (a < 0)
        *p++ = '-',  a = ~a+(b==0),  b = -b;
    for (i = 28; i >= 0; i -= 4)
        add(s, a>>i & 15);
    for (i = 28; i >= 0; i -= 4)
        add(s, b>>i & 15);
    for (i = NDIGIT; --i > 0 && s[i]==0; )
        ;
    do *p++ = s[i]+'0'; while (i-- > 0);
    *p = '\0';
    puts(buf);
}

int main()
{
    long a[2] = { 2, 1 };

    print_ll(a);
    return 0;
}


No.5479

Re:int 2つを結合し、10進数として出力したい
投稿者---かずま(2003/03/06 02:42:09)


面白い問題なので、別のやり方も考えてみました。
#include <stdio.h>

static int div10(unsigned long *x)
{
    unsigned long a = x[1] % 10 << 28 | x[0] >> 4;
    unsigned long b = a % 10 << 4 | x[0] & 15;
    x[1] /= 10,  x[0] = a / 10 << 4 | b / 10;
    return b % 10;
}

static void put_ull(unsigned long *x)
{
    int r;
    if (x[1] || x[0] > 9)
        r = div10(x), put_ull(x), putchar(r + '0');
    else
        putchar(x[0] + '0');
}

void put_ll(long *x)
{
    unsigned long y[2];
    if (x[1] < 0)
        putchar('-'),  y[1] = ~x[1] + !x[0],  y[0] = -x[0];
    else
        y[1] = x[1],  y[0] = x[0];
    put_ull(y);
    putchar('\n');
}

int main(void)
{
    long a[2] = { 2, 1 };
    put_ll(a);
    return 0;
}


No.5488

Re:int 2つを結合し、10進数として出力したい
投稿者---かずま(2003/03/06 11:09:53)


再帰呼び出しをしないものです。
#include <stdio.h>

static int div10(unsigned long *x)
{
    unsigned long a = x[1] % 10 << 28 | x[0] >> 4;
    unsigned long b = a % 10 << 4 | x[0] & 15;
    x[1] /= 10,  x[0] = a / 10 << 4 | b / 10;
    return b % 10;
}

void put_ll(long *x)
{
    unsigned long y[2];  char buf[20], *p = buf;

    if (x[1] < 0)
        putchar('-'),  y[1] = ~x[1] + !x[0],  y[0] = -x[0];
    else
        y[1] = x[1],  y[0] = x[0];
    do *p++ = div10(y) + '0'; while (y[0] || y[1]);
    do putchar(*--p); while (p != buf);
    putchar('\n');
}

int main(void)
{
    long a[2];
    a[1] = 1; a[0] = 2; put_ll(a);
    return 0;
}