【问题标题】:C# bitwise AND operator '&' logicC#按位与运算符'&'逻辑
【发布时间】:2016-03-21 10:44:30
【问题描述】:

我很难理解 ´&´ 运算符与此代码的关系:

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 }

【问题讨论】:

  • 为什么不直接使用调试器试一试?
  • 如果您只使用计数,列表的意义何在?
  • 它被称为按位与运算符,工作方式类似于72 &amp; 184 = 8 = 01001000 &amp; 10111000 = 00001000
  • @MatthewWatson 检查上次编辑
  • @HimBromBeer 检查上次编辑。我确实使用了调试器。这就是我要问的 & 运算符背后的逻辑

标签: c# logic operators unary-operator


【解决方案1】:

您需要了解 & 位和运算符的工作原理。

Bitwise AND Operator: &

按位与运算符 (&) 将第一个操作数的每一位与 第二个操作数的对应位。如果两个位都是 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

比较 0 与 0 的 00000000 将返回真,因为 0 等于零。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 2016-07-18
  • 1970-01-01
  • 2012-07-20
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多