2009-05-06 4 views
1

このコードの理解は正しいですか?私は、私たちの請負業者の1からいくつかのコードを見直してい

if (userLists != null) 
{ 
    Int32 numberOfItems = userLists.Count; 
    if ((numberOfItems & 1) == 1) 
    { 
     var emptyList = new tblList(); 
     userLists.Add(emptyList); 
    } 
} 

今、私はこれを理解しようとしているので、私はこの権利かどうかを持っている場合、誰かが私に確認してくださいすることができますか?

  1. userListのインスタンスはありますか?
  2. はい。 userListsオブジェクトの項目数を取得します。
  3. (アイテムの数が1(はい/真)、1が1(はい/真))、その結果が1(はい/真)の場合、空のリストオブジェクトをリストに追加します。
  4. その他:何もありません。

    if (numberOfItems == 1) 
    { 
    .. 
    } 
    

    にリファクタリングが、私は「空のリストをしたくないので、でもそれはがらくただことができる

もしそうなら(WTFFFFFFFFFFFFFFFFFFFF !!!!!!!!!!)、アイテム

私はそのコードを正しく読んだのですか?

ああ、IntInt32の使用で1つの以上ため息:((私は話を戻そう)。

+0

public static class Extensions { public static bool IsEven(this Int32 integer) { return (integer % 2 == 0); } } 

てみましょうあなたが...コードの可読性。例:(numberOfItems&1)== 1:numberOfItems.IsOdd()またはIsOdd(numberOfItems)またはisOdd =(numberOfItems&1)== 1; –

+0

は完全に合意されたSambo! JPは非常に良い拡張メソッドで返信しました:) –

答えて

6

&は、いわゆるビット演算子です。オペレータ&&は、2つのブール値テストのに対し:

TRUE && FALSE => FALSE 
TRUE && TRUE => TRUE 

&オペレータは、整数値で動作することができる:

00101101 (45) 
& 01011011 (91) 
--------------- 
= 00001001 (9) 

各ビットがそれに行わブール演算(および)を有しています。だからあなたのコードサンプルの場合、それは "最後のビットは1ですか?"と尋ねています。つまり、「それは奇妙なのですか?」数が23である場合たとえば、:

00010111 (23) 
& 00000001 (1) 
--------------- 
= 00000001 (1) 

だから、1 == 1ので、リストに追加されます。しかし数は22だった場合:

00010110 (22) 
& 00000001 (1) 
--------------- 
= 00000000 (0) 

だから、リストに追加されません。 。私たちは愚かなことしているので

+0

"&演算子はブール値で動作します:"つまり、int値ですか? –

+0

そうです。私はそれを修正した。乾杯! – Smashery

+0

番号が奇数であるかどうかをチェックする以外の目的で使用できますか? 便利な目的:D – CasperT

3

奇数のためにチェック、またi % 2 != 0

を行うことができ、私は、彼らはかなりすることができBitMasksを見てお勧めします便利な、しかし、あなたが偶数/奇数を行うために必要な場合は、あなたの問題のコードでは、私がmodulousを好むない。

static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
      Console.WriteLine(i & 1); 
     Console.ReadLine(); 
    } 


1 
0 
1 
0 
1 
0 

そして、それを一体のために、ここにいくつかの拡張メソッドです

class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> ints = new List<int>(); 

      for (int i = 0; i < 100; i++) 
      { 
       Console.WriteLine("Mod: {0}", i % 2); 
       Console.WriteLine("BitWise: {0}", i & 1); 

       ints.Add(i); 
       Console.WriteLine("Extension: {0}", ints.IsEven()); 
      } 
      Console.ReadLine(); 
     } 
    } 

    public static class ListExtensions 
    { 
     public static bool IsEven<T>(this ICollection<T> collection) 
     { 
      return (collection.Count%2) == 0; 
     } 

     public static bool IsOdd<T>(this ICollection<T> collection) 
     { 
      return (collection.Count%2) != 0; 
     } 
    } 
+0

aggreed mate!私はモジュロを好む、確かに! –

+1

+1、ビット単位のANDではなくmodを使用すると、奇数/偶数のチェックを行っているときにコードの意図がはるかにはっきりします。 – LukeH

6

数値を奇数または偶数のいずれかでチェックします(奇数の場合は1を返します)。このコードが実行しているのは、奇数の項目がある場合、別の項目を追加してリストに偶数の項目があることを確認することです。

0

(numberOfItems & 1)== 1

よりnumberOfItems%2のように!=(numberOfItems & 1)== 1 0

0

、それはビット単位のANDですです。 numberOfItemsが奇数かどうかをチェックしている場合は空のリストを追加しているようです。

0
((numberOfItems & 1) == 1) 

& 1は0番目のビットをテストします。整数データ型の場合、すべての奇数の値は0番目のビットが設定され、偶数の値はすべてクリアされます。上記のコードは、値が奇数であることを効果的にテストします。

0

は、保守/より理解しやすいようにリファクタリングすることでした:

if (userLists != null) 
{  
    EnsureListHasAnEvenNumberOfItems(userLists); 
} 
+0

また、bool ListHasOddLength = userLists.Count%2 == 1; if(ListHasOddLength)userLists.add(新しいtblList()); //別のメソッドにジャンプすることなく抽象化 –

0

はゼロ要素OKですか?

x =(0 &1)then (x == 1)はfalseです...

私は、請負業者にコードのコメントをもっと求めるべきだと思います。

3

...これは拡張またはヘルパーメソッドまたは説明varが出て役立つだろう例がある

numberOfItems.IsEven() 
+0

流暢!! nice :) –

+0

遠くの愚かな - 素敵なシンプルで実用的な拡張メソッド –

関連する問題