二进制中1的个数
程序员文章站
2022-07-14 23:42:01
...
题目是这样的:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
可能大部分人看到这个题的第一反应就是把数字的二进制表示换成字符串,然后去找里面1的个数。这种思维是人正常的思维,但不是计算机的思维,这种方式是对计算机不友好的,因为计算机只认识0和1,那有办法通过0和1的计算来得到结果吗?答案是肯定的
public int NumberOf1(int n) {
//排除特殊值
if(n==0)
return 0;
//当n<0的时候,取他的补码
if(n<0)
n=0^n;
int num=0;
//因为int是32位所以最多循环32次
for(int i=0;i<32;i++){
//把n向右移动一位,如果不是缩小2倍则末位是1,比如说111=7向右移动1位,
//3!=7/2.0,所以末位是1
if(n>>1!=n/2.0){
num++;
}
n=n>>1;
//如果==0就可以跳出循环了
if(n==0)
return num;
}
return num;
}
我选择这个算法题的主要原因是希望大家在写程序的时候,适当考虑一下自己的写法是否对计算机足够友好