Re: [問題] 32bit機器上輸入12 digits數字
引述
: 讓使用者輸入的是10進位的數,最大到999,999,999,999。
: 原來提供輸入的函式是存成char array,所以會變成
: addr 0x39
: addr+1 0x39
: ...
: addr+11 0x39 (共12 Bytes) 這也是我說的包袱的部分....沒法改
: 最後要輸出給另外一個I/O的必須變成 0xE8D4A50FFF (999,999,999,999的16進位)
: addr 0xFF
: addr+1 0x0F
: addr+2 0xA5
: addr+3 0xD4
: addr+4 0xE8
我提個細節你參考一下好了。為說明方便,這裡只使用 4 bytes ascii, "1123" ,
並假設是要存到 unsigned char big[2] 裡面去。
< 你的問題可以順利轉換從 12 bytes 存到 unsigned big[2] 裡去 >
一開始你可以先從 0x31 0x31 0x32 0x33 轉成 0x01 0x01 0x02 0x03
const size_t size= 4;
char str[4] = "1123";
for(i=0; i< size; ++i) str[i] - '0';
上面步驟實際上可省下來和其它步驟一起做,但因為比較複雜就不這麼做了。
再來是重點,從 10 進位轉成 2 進位。
圖畫得很醜,是連除法的示意圖,湊合著看。
< 第零次 >
2 | 1 1 2 3 --> 初始化 : 商=0, 餘=0, R=0
-------------
2 | 0 --> (0) : 被除=str[0]+R=0, 除=2 > 商=0,餘=1,R=餘*10=10
------------- str[0] = 商 = 0 ( 最後 assigned)
2 | 0 5 --> (1) : 被除=str[1]+R=11,除=2 > 商=5,餘=1,R=餘*10=10
------------- str[1] = 商 = 5
2 | 0 5 6 --> (2) : 被除=str[2]+R=12,除=2 > 商=6,餘=0,R=餘*10= 0
------------- str[2] = 商 = 6
2 | 0 5 6 1 --> (3) : 被除=str[3]+R=3 ,除=2 > 商=1,餘=1,R=餘*10= 10
------------- str[3] = 商 = 1
最後的餘 1,放到 big[0]:bit0 , bit[0] = 0000 0001 = 0x01
< 第壹次 >
2 | 0 5 6 1 --> 初始化 : 商=0, 餘=0, R=0
-------------
2 | 0 --> (0) : 被除=str[0]+R=0, 除=2 > 商=0,餘=0,R=餘*10=0
------------- str[0] = 商 = 0
2 | 0 2 --> (1) : 被除=str[1]+R=5, 除=2 > 商=2,餘=1,R=餘*10=10
------------- str[1] = 商 = 2
2 | 0 2 8 --> (2) : 被除=str[2]+R=16,除=2 > 商=8,餘=0,R=餘*10= 0
------------- str[2] = 商 = 8
2 | 0 2 8 1 --> (3) : 被除=str[3]+R=1 ,除=2 > 商=0,餘=1,R=餘*10= 10
------------- str[3] = 商 = 1
最後的餘 1,放到 big[0] : bit1 , bit[0] = 0000 0011 = 0x03
<.... 中間略過 ... >
< 第柒次 >
2 | 0 0 0 4 --> 初始化 : 商=0, 餘=0, R=0
-------------
2 | 0 --> (0) : 被除=str[0]+R=0, 除=2 > 商=0,餘=0,R=餘*10=0
-------------
2 | 0 0 --> (1) : 被除=str[1]+R=0, 除=2 > 商=0,餘=0,R=餘*10=0
-------------
2 | 0 0 0 --> (2) : 被除=str[2]+R=0, 除=2 > 商=0,餘=0,R=餘*10=0
-------------
2 | 0 0 0 2 --> (3) : 被除=str[3]+R=4 ,除=2 > 商=2,餘=0,R=餘*10=10
-------------
到第七次的時候(從第0次算起),big[0] = 0110 0011 = 0x63,
已算滿了 sizeof(unsigned char) * CHAR_BIT = 8 次,
所以再來就是往 big[1]: bit 0 重新開始了。
照著以上的步驟跑,最後可以算出
"1123" = (0000 0100) (0110 0011) = 0x04 0x63
那到底要計算到 第 x 次 ?二種方式。
(1) 直接計算 ceil ( n * log2(x) ) ,不過一般不用這個做停止條件。
(2) 當計算過程中, 只要商全部為零就是停止條件了。
< 怕數學不好出錯的話,就是商全為零、餘也為零>
事實上要從 asscii 轉到 2 進位不像轉到 10 進位那麼容易,
可能也有點花時間,以 n bytes ascii array 而言,
複雜度應是 O(nlogn)。
怎麼轉到你的問題,相信你已有了想法。
這沒用到什麼神奇的演算法,只是把思緒細節拆出來而已,一點意見,供參考。
--
我知道 ~ 但別說出來 ,
說出來讓人感到特別難過...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
→
06/18 18:30, , 1F
06/18 18:30, 1F
推
06/18 21:47, , 2F
06/18 21:47, 2F
推
06/18 23:24, , 3F
06/18 23:24, 3F
推
06/19 03:24, , 4F
06/19 03:24, 4F
推
06/19 09:00, , 5F
06/19 09:00, 5F
推
06/19 09:04, , 6F
06/19 09:04, 6F
→
06/19 14:06, , 7F
06/19 14:06, 7F
→
06/19 14:30, , 8F
06/19 14:30, 8F
推
06/19 18:35, , 9F
06/19 18:35, 9F
→
06/19 18:47, , 10F
06/19 18:47, 10F
→
06/19 18:48, , 11F
06/19 18:48, 11F
→
06/19 22:48, , 12F
06/19 22:48, 12F
推
06/19 23:57, , 13F
06/19 23:57, 13F
→
06/20 00:43, , 14F
06/20 00:43, 14F
→
06/20 00:44, , 15F
06/20 00:44, 15F
→
06/20 01:08, , 16F
06/20 01:08, 16F
→
06/20 01:09, , 17F
06/20 01:09, 17F
→
06/20 01:17, , 18F
06/20 01:17, 18F
→
06/20 01:18, , 19F
06/20 01:18, 19F
→
06/21 19:28, , 20F
06/21 19:28, 20F
→
06/24 23:01, , 21F
06/24 23:01, 21F
→
06/25 01:40, , 22F
06/25 01:40, 22F
→
06/25 04:00, , 23F
06/25 04:00, 23F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):