首先要先了解 Endian 的概念,可以看維基上的介紹,基本上這題要做的就是 Big-Endian 和 Little-Endian 之間的轉換。
由於儲存在電腦中的資料被處理的單位是以 Byte 為主,故如果是一個 32bits(4bytes) 整數通常會被分成 4 個部分去處理,那問題就在於這個整數的 4 個部分該怎麼去放。
例如:1234567890
- 換成二進位的數值是 01001001 10010110 00000010 11010010 ,將之分成四個 Byte 的部分就是
- 01001001
- 10010110
- 00000010
- 11010010
- 以 Big-Endian 來存放,從儲存地址低到高的順序就會是 (1) (2) (3) (4) ,也就是 01001001 10010110 11010010 11010010,與平常閱讀的方式相同。
- 而已 Little-Endian 來存放,從儲存地址低到高的順序就會是 (4) (3) (2) (1) ,也就是 11010010 11010010 10010110 01001001。
知道這個原理後,這題使用位元運算即可得解。
C++(0.000)
/*******************************************************/
/* UVa 594 One Little, Two Little, Three Little Endians*/
/* Author: Maplewing [at] knightzone.studio */
/* Version: 2018/10/06 */
/*******************************************************/
#include <iostream>
#include <cstdio>
int main(){
const int BYTES_COUNT = 4;
const int BITS_COUNT = 8;
const int BYTES_MASK = 255; // 11111111
int number;
while(scanf("%d", &number) != EOF){
printf("%d converts to ", number);
int oppositeEndianNumber = 0;
for(int i = 0 ; i < BYTES_COUNT ; ++i){
oppositeEndianNumber <<= BITS_COUNT;
oppositeEndianNumber |= (number & BYTES_MASK);
number >>= BITS_COUNT;
}
printf("%d\n", oppositeEndianNumber);
}
return 0;
}