江牧律师
首页
往期整理
  •   历史归档
  •   文章分类
  •   文章标签
关于我
江牧
文章
10
分类
2
标签
6
首页
往期整理
历史归档
文章分类
文章标签
关于我
技术学习
计算输入的数字在二进制下包含1的个数
发布于: 2024-9-9
最后更新: 2024-10-9
次查看
C语言
练习
type
status
date
slug
summary
tags
category
icon
password

📝 主旨内容

1.问题

计算输入的数字在二进制下包含1的个数

2.答案

思路1:

只要知道该数字二进制下各个位数上的数字,并且把数字是1的计入总数即可。
我们不妨借用我们最熟悉的10进制来思考该问题: 1234 1234%10=4 1234/10=123 123%10=3 123/10=12 12%10=2 12/10=1 1%10=1 1/10=0 相应的,如果是2进制的数字,譬如11,则: 11 其二进制为 1011 11%2=1 11/2=5 5%2=1 5/2=2 2%2=0 2/2=1 1%2=1 1/2=0 就这样,通过不断地%与/获得该数字在二进制下各个位数上的数字,并判断其是否为1,就可以得到其包含1的个数。代码实现:

思路2:

利用按位与运算符&,将该数与1进行运算,可以得知最后一位是否为1.再用位移算符>>不断地将该数的二进制位右移,以此遍历二进制的每一位。

思路3:

n=n&(n-1)每运行一次便会减少二进制中的一个1(不好想到该思路)
例如对于15,其二进制是1111,那么:
1111 - n 1110 - n-1 1110 - n 1101 - n-1 1100 - n 1011 - n-1 1000 - n 0111 - n-1 0000 - n
每运行一次便减少1,上段代码共运行了4次,所以15的二进制有4个1。 按照该思路写出代码如下:
在得知n=n&(n-1)每运行一次便会减少二进制中的一个1后,我们还可以用来判断一个数是否为2的n次方,因为2的n次方在二进制中只有一个1。代码如下:
类似的,我们可以借用^异或运算符和n=n&(n-1)得到两个不同数字二进制形式下不同位数的个数
 
  • 作者:江牧
  • 链接:https://lawyerjiang.top/article/practice/c/2
  • 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
解引用“指向空间已被释放的指针”,会得到怎样的值?
序列中删除指定数字
C语言中将数字0~9与对应字符相互转换
C/C++不能在子函数中求主函数中的数组长度
快速理解C语言指针和数组的关系
C语言中随机数的实现
起点解引用“指向空间已被释放的指针”,会得到怎样的值?
Loading...
目录
0%
📝 主旨内容1.问题2.答案思路1:思路2:思路3:
江牧
江牧
无限进步!
文章
10
分类
2
标签
6
最新发布
记一次个人服务器的搭建过程
记一次个人服务器的搭建过程
2025-4-28
document.write()、textContent、innerText 与innerHTML的区别
document.write()、textContent、innerText 与innerHTML的区别
2024-10-9
起点
起点
2024-10-9
解引用“指向空间已被释放的指针”,会得到怎样的值?
解引用“指向空间已被释放的指针”,会得到怎样的值?
2024-10-9
C语言中将数字0~9与对应字符相互转换
C语言中将数字0~9与对应字符相互转换
2024-10-9
C/C++不能在子函数中求主函数中的数组长度
C/C++不能在子函数中求主函数中的数组长度
2024-10-9
公告
-- 本网站正处于大规模装修建设中 --
目录
0%
📝 主旨内容1.问题2.答案思路1:思路2:思路3:
2022-2025 江牧.

江牧律师 | 无限进步!

Powered by NotionNext 4.7.4.