精華區beta Programming 關於我們 聯絡資訊
※ 引述《dyndns.bbs@bbs.wretch.cc ()》之銘言: : 0000000 : 0000001 ==> 這樣就合併成000000* : 0000010 : 0000011 ==> 這樣就合併成000001* : 由上面兩個 ==> 這樣就合併成00000** : 0000100 : 0000101 ==> 000010* : 0000111 ==> 0000111 : 0001000 : 0001010 : 下面還有一堆這樣的2進位的值,我要檢查並簡化規則 : 這樣的簡化有沒有一個專有的名詞???? : 還有請問一下有什麼演算法讓我能快速簡化它??? 我自己的一個點子... 8421法 (亂取名字 XD) 假設有一串數字:18,20,32,55,要化簡為pattern, 以2^n~(2^(n+1)-1)為分割區段,每個分割區段大致擁有同樣的pattern, 而預設的pattern為xxxxxxxxxxxxxxx. 在pattern中, 0,1是確定為單值bit, *則是確定為二相值bit, 而x代表未知且可接受改變值的bit. 上述數列中, 18與20都在16~31分割區段裏,共有pattern大概是1xxxx, 32,55位於32~63分割區段裏,共有pattern大概是1xxxxx. 因為目前數列跨越二個區段,可以確定整體pattern大概是**xxxx. 第五,六順位的LSB是*. 後面4bit不能確定,把它們再做一次. 要把每個數字都減掉它所屬分割區段的基數: 18-16, 20-16, 32-32, 55-32, 變成子數列2,4,0,23,子數列與原數列一一對應. 子數列依分割區段判斷: 0,2,4各佔一個區段. 23在16~31區段,pattern是1xxxx,無濟於事. 再做一次: 23-16 = 7,介於4~7,pattern大概是1xx. 此例整體來講,依序產生的pattern為: 未檢查: xxxxxxxxxxxxxxx 原數列: **xxxx 覆寫結果: **xxxx 子數列: 0000 覆寫結果: **0000 0010 覆寫結果: **00*0 0100 覆寫結果: **0**0 0111 覆寫結果: **0*** 結果: **0*** 後產生的往前覆寫,覆寫的規則大概是: 1. 前者bit為1: 後者是0或*,就覆寫為*. 後者為1或x不影響. 2. 前者bit為0: 後者是1或*,就覆寫為*. 後者為0或x不影響. 3. 前者bit為*: 後者為任何符號,通殺,不影響. 4. 前者bit為x: 後者為1,0,或*,都覆寫為後者. 後者為x不影響. 5. 最後把pattern剩下的x都換成0. 這樣做不知道快不快. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.92.115 ※ 編輯: razor 來自: 220.139.92.115 (02/03 19:20) ※ 編輯: razor 來自: 220.139.92.115 (02/03 19:23) ※ 編輯: razor 來自: 220.139.92.115 (02/03 19:32)