我发现很难理解'&'运算符与此代码的关系如何:
for(int cnt = 0; cnt < (1 << somelist.Count()); ++cnt)
{
for (int i = 0; i < somelist.Count(); ++i)
{
// 1 << 0 -- 1 -> 1
// 1 << 1 -- 10 -> 2
// 1 << 2 -- 100 -> 4
// 1 << 3 -- 1000 -> 8
// 1 << 4 -- 10000 -> 16
// 1 << 5 -- 100000 -> 32
var l = (1 << i);
if ((cnt & l) == 0)
{
// when is it getting here?
// some code to execute
}
}
}
哪些是进入if条件的情况和那些不进入的情况?为什么?
我已经在它上面使用了调试器,它背后的逻辑还不清楚。它的作用是:
e.g.
var cnt = 0
var l = 1
if ((cnt & l)==0){ // true }
var cnt = 1
var l = 1
if ((cnt & l)==0){ // false }
var cnt = 1
var l = 2
if ((cnt & l)==0){ // true }
var cnt = 1
var l = 4
if ((cnt & l)==0){ // true }
var cnt = 3
var l = 2
if ((cnt & l)==0){ // false }
var cnt = 3
var l = 4
if ((cnt & l)==0){ // true }
答案 0 :(得分:3)
你需要了解&amp;有点明智和操作员工作。
按位AND运算符(&amp;)将第一个操作数的每个位进行比较 第二个操作数的对应位。如果两个位都是1,那么 对应的结果位设置为1.否则,对应 结果位设置为0。
为了简单起见,我只用了一个字节来解释。
第一个案例
var cnt = 1
var l = 1
if ((cnt & l)==0){ // false }
00000001
00000001
===============
00000001
比较00000001(1为零)将返回false,因为1不等于零。
第二种情况
var cnt = 1
var l = 2
if ((cnt & l)==0){ // true }
00000001
00000010
===============
00000000
比较00000000(0为零)将返回true,因为0等于零。