概述
二进制相对于十进制来说总是比较抽象的。
例题:对于给定一个整数,要求统计整数中的二进制个数。
这个题有一个常规的思路就是我们统计这个整数最后一位是不是1,然后再将其右移移位。但是由此出现了一个严重的问题,如果是负数的话,右移之后前面时补1的,而不是补0。所以除非实现规定好右移多少次(4个字节 32次),否则,如果整数是否变为0来作为循环判断的话是会陷入死循环。
以此为启发,我们不移动整数了。以此判断从末尾到首位一共有多少个1:
int NumberOf1(int n) {
int count = 0;
unsigned int flag = 1;
while(flag) //循环结束条件一个关键的点,无符号的int在移位32次(32位,4个字节)后,会变成0
{
if(n&flag)
count++;
flag<<=1;
}
return count;
}
另外一个方法是减去1,整数中有多少位1就循环多少次,十分简洁:
int NumberOf1(int n) {
int count = 0;
while(n) //循环结束条件一个关键的点,无符号的int在移位32次(32位,4个字节)后,会变成0
{
n = (n-1)&n;//这个运算每做一次就会使得二进制中的1少一个
count++;
}
return count;
}
最后
以上就是儒雅水壶为你收集整理的剑指offer学习笔记——位运算1:统计二进制中的1的个数的全部内容,希望文章能够帮你解决剑指offer学习笔记——位运算1:统计二进制中的1的个数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复