【剑指offer】9.二进制中1的个数

问题

输入一个整数,输出该数二进制示意中1的个数。个中负数用补码示意。

剖析

这是一道考核二进制的问题

二进制或运算符(or):符号为|,示意若两个二进制位都为0,则效果为0,否则为1。

二进制与运算符(and):符号为&,示意若两个二进制位都为1,则效果为1,否则为0。

二进制否运算符(not):符号为~,示意对一个二进制位取反。

异或运算符(xor):符号为^,示意若两个二进制位不相同,则效果为1,否则为0

左移运算符m << n 示意把m左移n位,左移n位的时刻,最左侧的n位将被抛弃,同时在最右侧补上n个0,比方:

00001010<<2 = 00101000

右移运算符m >> n 示意把m右移n位,右移n位的时刻,最右侧的n位将被抛弃,同时在最左侧补上n个0,比方:

00001010>>2 = 00000010

我们能够让目的数字和一个数字做与运算

这个用户比较的数字必需只要一名是1其他位是0,如许就能够晓得目的数字的这一名是不是为0。

所以用于比较的这个数字初始值为1,比较完后让1左移1位,如许就能够顺次比较一切位是不是为1。

代码

function NumberOf1(n)
{
    let flag = 1;
    let count = 0;
    while(flag){
        if(flag & n){
            count++;
        }
       flag = flag << 1;
    }
    return count;
}
    原文作者:ConardLi
    原文地址: https://segmentfault.com/a/1190000017959524
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞