求一个整数装换为二进制数以后的的1的个数

来源:互联网 发布:淘宝照片处理软件 编辑:程序博客网 时间:2024/06/02 07:53

这里主要用移位运算符来完成这个目的,移位比用除法快很多。

c语言中移位运算符有^ &  |  >>  <<,(请注意&&和&的区别,||和|的区别)

java中还多一个移位运算符>>>(为我们移位方便很多)

>>这个运算符:要移位的数为正数时,没问题,当移位的运算符为负数时,高位为1,右移的时候会在高位一直填补1,最终将陷入无限循环,在java中用>>>解决了这个问题,右移时,无论正负均在高位补0;



第一种:

原理:将n&(0000 0001)等于最低位,判断最低位是否为1,决定count是否++;

java代码

int NumberOfOne(int n){
int count=0;
while(n){
if(n&1){
count++;
}
n=n>>>1;
}
return count;
}


c代码

//当n为负数时,出现前面所说的无限循环问题

int NumberOfOne(int n){
int count=0;
while(n){
if(n&1){
count++;
}
n=n>>1;
}
return count;
}

第二种

让n对2取余,因为只有当最低位为1才会出现取余等于1.

例如:1010,除最低位以外,其他位上出现1的时候必然是2的倍数,只有当最低位为1

的时候,才可能出现取余等于1。

略微改变了count++的判断条件,在判断条件上可以变化出很多种来

java代码

int NumberOfOne(int n){
int count=0;
while(n){
if(n%2==1){
count++;
}
x>>>1;
}
return count;
}



第三种

原理和第一种相似

定义一个flag=1来和n匹配,n不动,flag向左移动,flag必须和n类型相同

代码:

int NumberOfOne(int n){
int count=0;
int flag=1;
while(flag){
if(flag&n)count++;
flag=flag<<1;
}
return count;
}


第四种(推荐)

先看这个例子

10=1010;       1010

  9=1001;   &  1001

        =  1000

  8=0100;   &  0100

                    =  0000

每当n&(n-1)时,会将最右边的那个1消去,能&几次count就加几次。 

代码:

int NumberOfOne(int n){

int count=0;

while(n){

n=n&(n-1);

count++;

}

return count;

}






0 0
原创粉丝点击