码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer JZ-11

时间:2021-01-06 12:36:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sub   open   tle   ++   计算   tput   接下来   describe   scribe   

题目描述

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

输入

复制
10

返回值

复制
2

思路:

首先复习下原码、反码、补码(样例中均按照32位二进制计算)

原码:将整数取绝对值后转化为二进制,例如5的原码是 :00000000 00000000 00000000 00000101

反码:将原码按位取反:例如00000000 00000000 00000000 00000101按位取反后得到:11111111 11111111 11111111 11111010

补码:负数用补码表示。计算规则为:补码=反码+1

例如 -5的补码按下列步骤计算:

首先计算原码得到:00000000 00000000 00000000 00000101

接下来计算反码得到:11111111 11111111 11111111 11111010

最后计算补码得到:11111111 11111111 11111111 11111011

 

回到题目本身,最暴力的方法就是模拟上述步骤,这里不再展开。

我们考虑一个事实:

假设有:00000000 00000000 00000000 00010100

很显然上述减一得到:00000000 00000000 00000000 00010011

两者取&得到:00000000 00000000 00000000 00010000

我们可以发现 n&(n-1)后的结果,仅仅将n右侧第一个1改为了0

所以 我们循环执行上述操作,统计执行了多少次上述改变 就可以计算出n的二进制中1的个数

技术图片
class Solution {
public:
     int  NumberOf1(int n) {
         int ans = 0;
         while(n != 0)
         {
             ans++;
             n = n&(n-1);
         }
         return ans;
     }
};
View Code

 

 

剑指offer JZ-11

标签:sub   open   tle   ++   计算   tput   接下来   describe   scribe   

原文地址:https://www.cnblogs.com/alan-W/p/14227625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!