2016年5月23日 星期一

UVA 594 One Little, Two Little, Three Little Endians

/*
    題目連結

    個人覺得這一題非常有趣XDDD

    先來解釋一下題目 它說數字在記憶體中有兩種存法
    不過都是以 byte(4個bit) 為單位來存
    舉個例子比較好理解 然後byte之間 我會以 | 來分隔

    第一種存法中的 0000|0001|0010|0011
    在第二種存法中會是 0011|0010|0001|0000

    接著來講解法
    首先注意到 最高位的bit 會是數字正負的標記位
    這還要扯到什麼二的補數之類的非常麻煩

    所以呢 我們以signed的形式 
    直接寫到一個unsigned變數的記憶體位置!!!!!!
    也就是 scanf("%d", &num0); 這一行
    注意到我是用 signed的 "%d" 但num0的型態卻是unsigned
    這樣就沒有管正負號的bit 這樣一個特殊的存在
    所有的bit都被視作一樣了 非常方便XD

    接著就是一次取出一個byte 再慢慢加回去
    最後再以signed的形式 讀取unsigned變數的記憶體位置
    就大功告成

    另外 cin/cout 的寫法會變成
    cin>>*(int*)(&num0); 和 cout<<*(int*)(&num1)<<endl;
    讀者可以自己想想為什麼是這樣 XD

    是說 我有看到別人用union u{ int a; char c[4]; } 的做法
    用 int 讀入 再去 swap char array 也是非常的精妙 XDDD
*/
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    unsigned int num0, num1;

    while( scanf("%d", &num0) != EOF )
    {
        unsigned int p = num0;
        num1 = 0;

        for(int i = 0; i < 4; i++)
        {
            num1 *= 256;
            num1 += p%256;
            p /= 256;
        }

        printf("%d converts to %d\n", num0, num1);
    }
}

沒有留言:

張貼留言