我对这段代码的理解是否正确?

时间:2009-05-06 05:34:29

标签: c#

我正在审查我们的承包商的一些代码:

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

现在,我正在努力理解这一点,所以,如果我有这个权利,有人可以与我确认吗?

  1. 我们是否有userList的实例?
  2. 是。获取userLists对象中的项目数。
  3. if(项目数等于1(是/真)和1等于1(是/真))并且结果等于1(是/真),然后将空列表对象添加到列表中。
  4. 其他:没什么。
  5. 如果是这样(W.T.FFFFFFFFFFFFFFFFFFFF !!!!!!!!!!),那可以重构为

    if (numberOfItems == 1)
    {
    ..
    }
    

    但即便如此,因为我不想要一个带有“空”项目的列表。

    我是否正确阅读了这段代码?

    哦,使用Int32 vs Int再次感叹:(但我离题了)。

9 个答案:

答案 0 :(得分:6)

使用1对数字进行按位与运算,检查数字是奇数还是偶数(如果是奇数则返回1)。这段代码正在做的是如果有奇数个项目,通过添加另一个项目来确保列表具有偶数项目。

答案 1 :(得分:6)

&是所谓的按位运算符。而运算符&&测试两个布尔值:

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)

所以它不会添加到列表中。

答案 2 :(得分:3)

检查奇数,也可以i % 2 != 0

我建议看BitMasks它们可以非常方便,但不在你问题的代码中,如果你需要做偶数/奇数,我宁愿选择模数。

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

答案 3 :(得分:3)

因为我们很傻......

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

让你做......

numberOfItems.IsEven()

答案 4 :(得分:0)

(numberOfItems&amp; 1)== 1

更像是numberOfItems%2!= 0

答案 5 :(得分:0)

表示(numberOfItems&amp; 1)== 1,这是一个按位AND。它似乎在检查numberOfItems是否为奇数,如果是,则添加一个空列表。

答案 6 :(得分:0)

((numberOfItems & 1) == 1)

&安培;用1测试第0位。对于整数数据类型,所有奇数值都设置为第0位,并且所有偶数值都将其清除。上面的代码有效地测试了奇数值。

答案 7 :(得分:0)

可以重构为更易理解/可维护:

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

答案 8 :(得分:0)

零元素可以吗?

然后

x =(0&amp; 1) (x == 1)是假的......

我认为你应该让你的承包商更多地评论他们的代码。