JZ11 剑指offer 二进制中1的个数

这篇博客介绍了如何使用位操作快速计算一个整数在32位二进制表示中1的个数。通过n与n-1做位与运算,可以有效地遍历并消除二进制表示中的1,从而统计1的个数。这种方法适用于包括负数(补码表示)在内的所有整数。此外,还解释了补码的概念及其在计算机中的应用。

第11题 二进制中1的个数

题目描述

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

class Solution {
public:
     int  NumberOf1(int n) {
         int ans = 0;
         while(n!=0){
             ++ans;
             n = n & (n-1);
         }
         return ans;
     }
};

思路:
这是一种快速的求1方法,n与n-1做位&运算得到n从右往左的第一位为1的位置开始(包含)到末位都变成0,也就是每次循环都只遍历1的位置,跳过0的位置。
补码:
补码
1.负数的补码:求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
2.在补码表示中,最高位(符号位)表示数的正负,在形式上与原码相同,即 0正 1负。但补码的符号位是数值的一部分,由补码定义式计算而得。例如,负小数补码中为 1,这个 1是真值(负)加模 2后产生
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值