2012-06-08 18 views

回答

3

你提出的建議是可能的,但是沒有什麼意義。下面是以位爲單位的值表示(僅顯示相關位,所有剩下的部分都是零):

2:000010 || 123:1111011 || 13:001101

有沒有合乎邏輯的方法來將123更改爲13位操作。最好將它轉換成一個字符串或字符數組,然後移除它們,然後將它轉換回int。

+0

當然有。如果我們不限於*只是*「使用常量2和123」:-) – 2012-06-08 04:38:25

+0

謝謝。我將它轉換爲字符串並返回到int。我只是在尋找一個可能的微觀優化.. :) – Jack

+0

@pst你的意思是'如果我們'?在運行時生成一個掩碼比使用字符串/字符數組更難。我無法想象你會怎麼做這個工作... – evanmcdonnal

1

還有哪些其他情況?如果存在某種模式,則可以將其泛化爲整數級別,否則您只是在查看字符串替換。

1232實際上是2E1 (10100),並且在所述123422E2 (11001000)兩者都沒有涉及到2 (10),至少在逐位形式。另外,在除去數的右側的「數量」將需要被添加到數字的數目去除的左側/ 10

即,去從123到13:

Located "2". 
Number on left (x): 100 
Number on right (y): 3 
y + (x/10) = 13 

,並從1324到134

Located "2" 
Number on left (x): 1300 
Number on right (y): 4 
y + (x/10) = 134 

除非有一些模式(即你知道什麼樣的立場的數字是),你只需要.ToString()數,然後做一個.Replace("2", ""),在做之前結果爲int.Parse()

你很可能定義某種遞歸函數做這種純粹以整數形式,但它會是一個很多工作,爲的ToString()和int.Parse()

編輯的小的開銷:因爲我很無聊,我寫了一個遞歸的「整數」版本。

static int remove_digit(int number, int digit) 
    { 
     int sum = 0; 
     if (number > 0) //can't remove 0, doesn't matter if the "digit" is 0 also. 
     { 
      int factor = 1; 
      int temp = number; 
      while (temp > 0 && temp % 10 != digit) 
      { 
       sum += (temp % 10) * factor; 
       factor *= 10; 
       temp /= 10; 
      } 
      sum += remove_digit(temp/10, digit) * factor;//recursion to remove any further digits. 
     } 
     return sum; 
    } 

沒有花太多時間優化代碼,所以可能有一些冗餘。隨意修改它。

Console.WriteLine(remove_digit(125254443, 2));

結果: 1554443

編輯:修改了代碼,現在稍快。

+0

做了一些測試,甚至缺乏優化,這超出了執行'int.Parse(1000000001.ToString()。Replace(「0」,「」) ))',雖然哈哈不是很多 –

0

由於我們正在處理基數爲10的數字,所以在基數2中的操作是很難說的。使用一些數學,除去從k中的第n個位,並移動經是

(k/pow(10,n))*pow(10, n-1) + k%pow(10, n-1) 

在基體2,<<>>操作者的行爲像由pow(2, n)相乘,並&用掩模確實的%的工作,但在基數10中,位不排列。

0

這是非常尷尬的,但如果你真的必須只有按位操作,我建議你convert the number to BCD。一旦進入BCD,你基本上有一個十六進制數字,數字在0到9之間,所以刪除一個數字非常簡單。完成後,轉換回二進制。

我不相信有人會想這樣做。

相關問題