计算C#中子网掩码中的位数

时间:2012-01-03 11:23:01

标签: c# mask subnet

我有一项任务要在C#中完成。我有一个子网掩码:255.255.128.0。

我需要找到子网掩码中的位数,在本例中为17。

但是,我需要能够在C#中完成此操作而不使用System.Net库(我编程的系统无法访问此库)。

似乎这个过程应该是这样的:

1)将子网掩码拆分为八位字节。

2)将八位字节转换为二进制。

3)计算每个八位字节中的一个数。

4)输出找到的总数。

然而,我的C#很差。有没有人有C#知识可以提供帮助?

5 个答案:

答案 0 :(得分:3)

比特计数算法取自: 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);

使用了本文中最简单的算法。如果性能至关重要,您可能需要阅读本文并使用更优化的解决方案。

答案 1 :(得分:1)

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;

答案 2 :(得分:0)

您可以将数字转换为二进制,如下所示:

        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;

答案 3 :(得分:0)

完整的样本:

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

        }

答案 4 :(得分:0)

解决方案是使用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=01x1=1 。所以,如果我们有一些假设数字

0000101001并将其乘以1(所以在二进制世界中我们执行&amp;),然后{h}除了0000000001之外,我们得到

0000101001
0000000001

这两个数字中的大多数正确数字为1,因此binary AND会返回1,否则如果 ANY 数字为0,结果为0

所以在这里,在total += oct & 1行,我们根据该数字添加tolal 10

在线 {2} ,我们只需将次要位移到右侧,实际上,将数字除以2,直到它变为{ {1}}。

易。

编辑

这适用于0intgere类型,但不要在byte数字上使用此技术。顺便说一句,对于这个问题来说,它是非常有价值的解决方案。