20120111

ACM 594 One Little, Two Little, Three Little Endians

endian的概念 + 2的補數。
所以正負數的換算可以用:
負數 + 2 ^ x = 正數
正數 - 2 ^ x = 負數
x表示bit數。
以8為一個單位31~24、23~16、15~8、7~0,
轉成7~0、15~8、23~16、31~24的形式即可。
先判斷正負值再做運算,運算後判斷正負值,就可以輸出了。

神人解法

/* ACM 594 One Little, Two Little, Three Little Endians
 * mythnc
 * 2012/01/11 14:19:06   
 * run time: 0.008
 */
#include <stdio.h>
#include <string.h>

#define MAX 32

int convert(int);

int main(void)
{
    int x;

    while (scanf("%d", &x) == 1)
        printf("%d converts to %d\n", x, convert(x));

    return 0;
}

/* convert: convert x to different endian system */
int convert(int x)
{
    int endian[MAX];
    int i, mul;
    
    memset(endian, 0, sizeof(endian));
    if (x < 0) {
        endian[7] = 1;
        x += 2147483647;
        x++;
    }
    i = 24;
    while (x) {
        endian[i++] = x % 2;
        x /= 2;
        if (i % 8 == 0)
            i -= 16;
    }
    for (i = x = 0, mul = 1; i < MAX - 1; i++, mul *= 2)
        x += mul * endian[i];
    if (endian[i] == 1) {
        x -= 2147483647;
        x--;
    }

    return x;
}

沒有留言: