none
想請問一個有關數值逆推問題 RRS feed

  • 問題

  • Dear all,

    又有問題要請教各位..

    標題不知如何下,希望各位看的懂

    如果我有幾個數值

    例如 1,2,4,8,16,32,64

    今天隨便給一個裡面加總的值

    假設是 48 ,那有什麼方法或演算法可以逆推回去,知道該值是由 16,32 加總出來的

    48該加總值一定是由上述數字加總出來的,所以一定會落在這些組合裡面,

    我的需求是預計取出這些組合的數值後,可以依據來判斷哪些Checkbox被勾選。

     

     

    2010年11月23日 上午 09:03

解答

  • ...

    這是計算機概論等級的問題,你把 48 轉 2 進位,答案就出來了。通常稱為位元旗標運算。

    48 的 2 進位值:11 0000

    => 個位數為第 0 個,兩個 1 分別為第4位(2^4=16) 及第5位(2^5=32)


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月23日 下午 03:24

所有回覆

  • C# 運算子

    http://msdn.microsoft.com/zh-tw/library/6a71f45d(VS.90).aspx

    您是把CheckBox1~7做OR運算吧,使用>>每次右移一位元,再AND 0x1,如果為1,則CheckBox有選到,以此類推試試...

    2010年11月23日 上午 09:15
  • int[] list = new int[] { 1, 2, 4, 8, 16, 32, 64, 128 };
    int random = 48;
    
    foreach (int i in list) {
      if ((random & i) == i) {
        MessageBox.Show(i.ToString());
      }
    }
    
    2010年11月23日 上午 10:02
  • ...

    這是計算機概論等級的問題,你把 48 轉 2 進位,答案就出來了。通常稱為位元旗標運算。

    48 的 2 進位值:11 0000

    => 個位數為第 0 個,兩個 1 分別為第4位(2^4=16) 及第5位(2^5=32)


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月23日 下午 03:24
  • 感謝 Joe Hung、阿尼、心冷熱情熄 大大提供的答案

    真是愈寫愈回去了…計概沒學好…sorry...@@

    不過,後來發現,我剛好挑到的範例不好,

    其實是有很多組數值 有的不氣剛好 形成 1 2 4 8 32 64 這樣的關係

    有些是不規則的 ex 1 2 3 5 6 8

    因此當初一直在考慮多種組合問題

    像是 若總合是14,取到的組合可能不止一種

     {3,5,6}、{8,6}、{1,2,3,8}

    就是把可能的組合list出來…後續會另一規則來判斷要選擇哪一組,

    再對應到Checkbox這類的元件上~

    2010年11月24日 上午 12:46
  • 因此當初一直在考慮多種組合問題

    像是 若總合是14,取到的組合可能不止一種

     {3,5,6}、{8,6}、{1,2,3,8}

    就是把可能的組合list出來…後續會另一規則來判斷要選擇哪一組,

    再對應到Checkbox這類的元件上~

    如果你可以自己選定組合的話, 為何不簡單一點就好了 .

    一個 bit 就是代表一種模式, 然後再 combine 出多種變化,

    像你一開始選的例子.

    2010年11月24日 上午 09:52
  • 任意集合轉 CheckBox 程式設計上不會這樣設計:

    1. 效能不彰

    2. 無法有絕對的強邏輯,只能 case by case 。

     

    這部分已有常見慣例:

    1. 多選一: 0, 1, 2, 3, 4, ...

    2. 多選多:0, 1, 2, 4, 8, ...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月24日 下午 03:16
  • 如果是用二進制 0 1 2 4 8 16 32 64 ...

    假設是48,

    32<48<64,所以一定含有32,

    減掉32,剩16

    8<16<=16,所以一定含有16,

    減掉16,剩0。

     

    透過一個遞迴即可逆推出組成元素的唯一解。

    如果要配合 CheckBox,可規則命名控制項。假設有7個:

    private void ReverseState(int point)
    {
        for (int i = 6; i >= 0; i--)
        {

          bool Checked = False;

          if (point >= Math.Pow(2.0, i))
          {

              Checked = True;

              point -= (int)Math.Pow(2.0, i);
           }

          ((CheckBox)(flowLayoutPanel1.Controls.Find(string.Format("CheckBox{0}", i + 1), false))[0]).Checked = Checked;

        }

     }

     

     

     

     

    2010年11月26日 上午 04:45