c#中的&除了逻辑判断之外还代表什么意思?

qq_28273155 2015-07-13 09:11:35
leetcode 上的一道算法题,
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.



这道题小白我完全没思路,然后看了一下答案,发现是这么写的:

public class Solution {
public int HammingWeight(uint n) {
int re = 0;

while(0 != n)
{
n = n&(n - 1);
++re;
}

return re;
}
}

那么问题来了,里面关键的n = n&(n - 1);是什么意思?
...全文
139 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
庚武讲堂 2015-07-13
  • 打赏
  • 举报
回复
& 标准的叫法: 按位与 1 & 1 = 1 其它都为0 解决方案确实巧妙,举例分析确实是对的。
1011 & 1010
n = 1010
re = 1


1010 & 1001
n = 1000
re = 2


1000 & 0111
n=0
re = 3
  • 打赏
  • 举报
回复
如果你打印 n 的过程可以发现,表达式 n = n&(n - 1); 是用来“让最右边的一个1 被消去”这个目的而写的! 因为不管哪一位为1,如果整个数值-1,那么恰好它会可以保证这个1左边的所有bit(0、1)都不变,而右边的每一个bit恰好取反。这样就可以进行 & 运算了。
道玄希言 2015-07-13
  • 打赏
  • 举报
回复
& 位逻辑与运算符 运算对象类型 -- 整型,字符型 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。
  • 打赏
  • 举报
回复
这个题还是通过左移>>来运算
public static int HammingWeight(uint n)
        {
            int re = 0;
            do
            {
                if ((n & 1) == 1)
                {
                    ++re;
                }
                n = n >> 1;
            }
            while (0 != n);
            return re;
        }

        public static int HammingWeightWithString(uint n)
        {
            return Convert.ToString(n, 2).Count(x => x == '1');
        }
  • 打赏
  • 举报
回复
& 不是逻辑值表达式,是数值计算表达式。
happy_Can 2015-07-13
  • 打赏
  • 举报
回复
二进制位运算。如 1001&0001=0001
  • 打赏
  • 举报
回复
二进制并运算

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧