剑指offer(11)二进制中1的个数

本文介绍了一种高效算法,用于计算任意整数(包括负数)二进制表示中1的个数。通过使用位运算技巧n&n-1,可以巧妙地消除最右边的1,直到整数变为0,从而计数所有1的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(19.1.6)

剑指offer(11)二进制中1的个数

题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

我一开始想着转换为二进制再遍历一遍32位0,1串的。但发现负数的补码挺麻烦的,就换了个角度。

toString(2)可以转为二进制,但负数也仅仅加了个负号。

所以另一种方法,n&n-1

n-1时

xxxxx11110要向前借个2所以结果为xxxxx11101,是0的话继续往前借。

n&n-1时

xxxx11000&xxxx1001会把第一个n的从右数第一个1变为0,所以n = n&n-1时,count++就可以求出1
的个数。

代码如下:

function  NumberOf1( n) {
    var count=0;
    while(n)
    {
        n=n&n-1;	
        ++count;
    }
    return count;
 }

 console.log(NumberOf1(-1));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值