剑指OOFFER——二进制中1的个数

本文介绍了两种计算二进制中1的个数的算法。算法一利用与运算和右移操作,时间复杂度为O(n),适用于int类型。算法二通过n与n-1的与运算消除最右侧的1,时间复杂度为O(log k),其中k为二进制中1的个数。
摘要由CSDN通过智能技术生成

在这里插入图片描述

算法一:时间复杂度O(n)

预备知识:

十进制的二进制形式与1进行与运算,若结果为1,则二进制的最后一位是1,若结果为0,则二进制的最后一位是0.

原因:1的二进制前面全为0,只有最后一位为1,所以任何数跟1进行与运算,除了最后一位不一定为0,其他高位全部为0.例如:7(111) 跟 1(001)进行与运算结果为1(001);6(110)跟1进行与运算结果0(000);

算法思路:

将数的二进制跟1进行与运算,若结果为1说明数的最后一位为1,计数器加一,然后将数的二进制右移一位(即舍弃最低位),然后继续循环跟1进行与运算直到该数变为0,则统计出来数的二进制中有几个1。算法复杂度为数的二进制位数,int类型最多32位。

注意:右移的时候需要用无符号右移>>>,不能用有符号位移>>,因为有符号位移时,如果是负数会在高位补1,正数在高位补0,而无符号位移不管是正数还是符数都在高位补0.这个运算符好像只有java有,C++没有,所以C+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值