我正在审查我们的承包商的一些代码:
if (userLists != null)
{
Int32 numberOfItems = userLists.Count;
if ((numberOfItems & 1) == 1)
{
var emptyList = new tblList();
userLists.Add(emptyList);
}
}
现在,我正在努力理解这一点,所以,如果我有这个权利,有人可以与我确认吗?
如果是这样(W.T.FFFFFFFFFFFFFFFFFFFF !!!!!!!!!!),那可以重构为
if (numberOfItems == 1)
{
..
}
但即便如此,因为我不想要一个带有“空”项目的列表。
我是否正确阅读了这段代码?
哦,使用Int32
vs Int
再次感叹:(但我离题了)。
答案 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)是假的......
我认为你应该让你的承包商更多地评论他们的代码。