求一个整数装换为二进制数以后的的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;
}
- 求一个整数装换为二进制数以后的的1的个数
- 求一个整数的二进制数中1的个数
- 求一个整数中,二进制数含有1的个数
- 求一个数转换为二进制中1的个数
- 求一个数转化为二进制后1的个数
- 求一个数二进制1的个数
- Java实现求一个整数的二进制数中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 一个简单的串口接收数据程序
- 利用php访问数据库数据表,生成javabean.java文件,符合javabean语法
- poj 3278 bfs
- [BZOJ 1143][CTSC 2008]祭祀river(二分图最大独立集)
- PHP汉语转拼音(支持20378汉字)
- 求一个整数装换为二进制数以后的的1的个数
- LeetCode 找到一个字符串数组的最长公共前缀
- 2014观后有感
- 数据结构第五章 树和二叉树 知识导图
- BZOJ 2821 作诗(Poetize) 分块
- (3)SlidingMenu开源框架的SlideMenu在项目的使用方法+Fragment
- Mac上使用Cario
- C语言实现字符串反转
- 我的Github