相关文章推荐
爱吹牛的海龟  ·  计算机编码--c语言中输出float的十六进 ...·  2 月前    · 
千杯不醉的牙膏  ·  如何在python中将16位十六进制和二进制 ...·  2 月前    · 
俊逸的石榴  ·  蛟川双语小学今年招生6个班级,今年毕业生可直 ...·  1 年前    · 
内向的烤面包  ·  Linux之grep风骚用法_51CTO博客 ...·  1 年前    · 
豪爽的烈马  ·  2024 年全国大学生物联网设计竞赛·  1 年前    · 
玉树临风的长颈鹿  ·  每天5000万元投资!耐心资本做“燃料”,助 ...·  1 年前    · 
年轻有为的香烟  ·  借道SPAC 中国企业赴美上市再度活跃 - ...·  1 年前    · 
Code  ›  C#版 - 剑指offer 面试题10:二进制中1的个数 题解开发者社区
二进制代码 二进制
https://cloud.tencent.com/developer/article/1398650
微醺的匕首
2 年前
作者头像
Enjoy233
0 篇文章

C#版 - 剑指offer 面试题10:二进制中1的个数 题解

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 大白技术控的技术自留地 > C#版 - 剑指offer 面试题10:二进制中1的个数 题解

C#版 - 剑指offer 面试题10:二进制中1的个数 题解

作者头像
Enjoy233
发布 于 2019-03-05 14:16:43
641 0
发布 于 2019-03-05 14:16:43
举报

剑指offer 面试题10:二进制中1的个数

二进制中1的个数

提交网址: http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164

参与人数:7222  时间限制:1秒   空间限制:32768K 输入一个整数,输出该数二进制表示中1的个数。(温馨提示: 计算机中负数用补码表示。)

先贴上代码,然后来详细介绍原理哈...

AC代码:

#include<iostream>
using namespace std;
class Solution {
public:
     int NumberOf1(int n) {
         int count=0;
         while(n != 0)
        	 n=n&(n-1);  // 每进行一次,将最右侧存有1的bit的值置为0,直到全0,退出循环 
             count++;
         return count;         
// 以下为测试 
int main()
	int num1=-6;
	int num2=0;
	int num3=-1;
	int num4=+255;
	int num5=7;				
	Solution sol;
	cout<<sol.NumberOf1(num1)<<endl;  // -6对应的32bit中,有2位是0,其余都是1 
	cout<<sol.NumberOf1(num2)<<endl;
	cout<<sol.NumberOf1(num3)<<endl;
	cout<<sol.NumberOf1(num4)<<endl;
	cout<<sol.NumberOf1(num5)<<endl;				
	return 0;
代码中的 n&(n-1) 是什么意思?

计算机组成原理 背景知识:

计算机中如何表示负数?

设计计算机的人设想,把最高位作为符号位,0表示正数,1表示负数,于是原码诞生了。计算机中8位二进制数(原码)的表示范围如下: 负数:1 111 1111 ~ 1 000 0000 (-127 ~  -0),正数:0 000 0000 ~ 0 111 1111 (0 ~ 127) 但是如果在计算机中像这样用原码表示负数,那么数的相加减就很不方便了。因此计算机中有符号数都是用补码形式表示,此点需时刻牢记于心! 补码怎么计算?

1、正数:原码和补码一致 2、负数:原码除符号位外后按位取反,然后加1 (从补码求原码的方法:符号位除外,先减1,再按位取反。) 3、[+0]补=[-0]补=0x00000 如果用4个字节来表示-7~8,则-3的在计算机中的表示是1101(原码为1011),则-2的在计算机中的表示是1110(原码为1010),-1在计算机里用二进制表示就是全1,4位2进制为1111,16进制为:0xFFFFFF 1. 如果n>0,正数的补码和原码一致 (1)当n为正奇数时(n的二进制表示的末位为1):  n:           xxxxxxxx1  n-1:        xxxxxxxx0  n&(n-1):  xxxxxxxx0  n&(n-1)相当于去掉n的二进制表示中最右边的一个1。  (2)当n为正偶数时(n的二进制表示的末位为0):  n:           xxxxx1000  n-1:        xxxxx0111  n&(n-1):  xxxxx0000  n&(n-1)相当于去掉n的二进制表示中最右边的一个1。 2. 如果n<0 (3)当n为负奇数时,比如-1:  n=-1:           1111  n-1=-2:        1010 n&(n-1):       1010 n&(n-1)相当于去掉n的二进制补码中最右边的一个1。 (4)当n为负的偶数时,比如-2: n=-2:           1010  n-1=-3:        1101 n&(n-1):       1000 n&(n-1)相当于去掉n的二进制补码中最右边的一个1。 3. 如果n=0

(5) 当n=0时 n=0:            0000 n-1=-1:       1111 n&(n-1):      0000 n&(n-1)相当于去掉n的二进制补码中最右边的一个1(或 不处理,因为0的二进制补码中没有1)。

如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个1.

 
推荐文章
爱吹牛的海龟  ·  计算机编码--c语言中输出float的十六进制和二进制编码 - tlz888
2 月前
千杯不醉的牙膏  ·  如何在python中将16位十六进制和二进制表示转换为十进制浮点数(反之亦然)?开发者社区
2 月前
俊逸的石榴  ·  蛟川双语小学今年招生6个班级,今年毕业生可直升蛟川书院
1 年前
内向的烤面包  ·  Linux之grep风骚用法_51CTO博客_linux命令grep用法
1 年前
豪爽的烈马  ·  2024 年全国大学生物联网设计竞赛
1 年前
玉树临风的长颈鹿  ·  每天5000万元投资!耐心资本做“燃料”,助力中国商业航天
1 年前
年轻有为的香烟  ·  借道SPAC 中国企业赴美上市再度活跃 - 21经济网
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号