3

C# で完了するタスクがあります。サブネット マスクは 255.255.128.0 です。

サブネット マスクのビット数を調べる必要があります。この場合は 17 になります。

ただし、 System.Net ライブラリを使用せずに C# でこれを実行できる必要があります(プログラミングしているシステムはこのライブラリにアクセスできません)。

プロセスは次のようになります。

1) サブネット マスクをオクテットに分割します。

2) オクテットをバイナリに変換します。

3) 各オクテットの 1 の数を数えます。

4) 見つかった Ones の総数を出力します。

ただし、私のC#はかなり貧弱です。C# の知識を持っている人はいますか?

4

5 に答える 5

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);

記事の最も単純なアルゴリズムが使用されました。パフォーマンスが重要な場合は、記事を読み、そこから最適化されたソリューションを使用することをお勧めします。

于 2012-01-03T11:34:50.007 に答える
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;
于 2012-01-03T11:32:43.387 に答える
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

        }
于 2012-01-03T11:36:47.823 に答える
0

binary operation解決策は、 likeを使用することです

  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,1x1=1です。したがって、仮の数がある場合

0000101001そしてそれを掛けます1(バイナリの世界では & を実行します)。0000000001

0000101001
0000000001

一番の数字は1両方の数字にあるので、binary ANDリターン1を行います。それ以外の場合、マイナー数字のいずれかが になる0場合、結果は になります0

したがって、ここでは、その桁数に基づいて、またはのいずれかにオンラインtotal += oct & 1で追加します。tolal10

{2}では、代わりにマイナービットを右にシフトするだけです。実際には、数値を で割り、2になるまで0です。

簡単。

編集

これは型に対しても有効ですがintgere、数値に対してbyteこの手法を使用しないでください。floating pointちなみに、この質問に対する非常に価値のある解決策です。

于 2012-01-03T11:53:49.807 に答える
0

次のように数値を 2 進数に変換できます。

        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;
于 2012-01-03T11:27:59.983 に答える