簡體   English   中英

在 C# 中計算子網掩碼中的位數

[英]Calculating the number of bits in a Subnet Mask in C#

我有一個任務要在 C# 中完成。 我有一個子網掩碼:255.255.128.0。

我需要找到子網掩碼中的位數,在本例中為 17。

但是,我需要能夠在不使用 System.Net 庫的情況下在 C# 中執行此操作(我正在編程的系統無法訪問該庫)。

這個過程似乎應該是這樣的:

1) 將子網掩碼拆分為八位字節。

2) 將八位字節轉換為二進制。

3) 計算每個八位字節中 1 的數量。

4) 輸出找到的總數。

但是,我的 C# 很差。 有沒有人有 C# 知識可以提供幫助?

位計數算法取自:
http://www.necessaryandsufficient.net/2009/04/optimising-bit-counting-using-iterative-data-driven-development/

string mask = "255.255.128.0";
int totalBits = 0;
foreach (string octet in mask.Split('.'))
{
    byte octetByte = byte.Parse(octet);
    while (octetByte != 0)
    {
        totalBits += octetByte & 1;     // logical AND on the LSB
        octetByte >>= 1;            // do a bitwise shift to the right to create a new LSB
    }                
}
Console.WriteLine(totalBits);

使用了文章中最簡單的算法。 如果性能至關重要,您可能需要閱讀這篇文章並從中使用更優化的解決方案。

string ip = "255.255.128.0";
string a = "";
ip.Split('.').ToList().ForEach(x => a += Convert.ToInt32(x, 2).ToString());
int ones_found = a.Replace("0", "").Length;

您可以像這樣將數字轉換為二進制:

        string ip = "255.255.128.0";
        string[] tokens = ip.Split('.');
        string result = "";
        foreach (string token in tokens)
        {
            int tokenNum = int.Parse(token);
            string octet = Convert.ToString(tokenNum, 2);
            while (octet.Length < 8)
                octet = octet + '0';
            result += octet;
        }
        int mask = result.LastIndexOf('1') + 1;

一個完整的樣本:

public int CountBit(string mask)
        {

            int ones=0;
            Array.ForEach(mask.Split('.'),(s)=>Array.ForEach(Convert.ToString(int.Parse(s),2).Where(c=>c=='1').ToArray(),(k)=>ones++));
          return ones

        }

解決方案是使用binary operation

  foreach(string octet in ipAddress.Split('.'))
  {       
      int oct = int.Parse(octet);     
      while(oct !=0) 
      {
              total += oct & 1; // {1}
              oct >>=1;  //{2}          
      }   
  }

訣竅在於,在行{1} 上binary AND 1x0=0是一個乘法,因此乘以1x0=0 , 1x1=1 所以如果我們有一些假設數

0000101001並將其乘以1 (因此在二進制世界中我們執行 &),然后是0000000001 ,我們得到

0000101001
0000000001

兩個數字中最右邊的數字都是1 ,因此進行binary AND返回1 ,否則如果任何數字的次要數字為0 ,則結果將為0

所以在這里,在total += oct & 1線上total += oct & 1我們根據該數字數字將10添加到tolal

在行{2} 上,我們只是將次要位右移,實際上是將數字除以2 ,直到它變為0

簡單。

編輯

這對intgerebyte類型有效,但不要在floating point使用此技術。 順便說一句,對於這個問題,這是非常有價值的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM