如何判断整数x的二进制中含有多少个1
来源:互联网 发布:莫扎特 知乎 编辑:程序博客网 时间:2024/05/16 08:12
主要是利用位操作来判断每一位是否为1
方法一:
清除整数a最右边的1可以使用这个操作:a&(a-1)
所以可以利用这个方法来得到1的个数:
int count_one(unsigned x){
int count=0;
while(x){
count++;
x=x&(x-1);
}
return count;
}
int count=0;
while(x){
count++;
x=x&(x-1);
}
return count;
}
方法二:
对整数进行移位,然后判断最后一位是否为1
int count_one2(unsigned x){
int count=0;
int i=0;
while(i<32){
if((x>>i)&0x1)
count++;
i++;
}
return count;
}
int count=0;
int i=0;
while(i<32){
if((x>>i)&0x1)
count++;
i++;
}
return count;
}
方法三:
这个方法和方法二类似,只是每次移动4位。
int count_one3(unsigned x){
static const int hex[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
int count=0;
int i=0;
while(i<8){
count+=hex[(x>>(i*4))&0xf];
i++;
}
return count;
}
static const int hex[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
int count=0;
int i=0;
while(i<8){
count+=hex[(x>>(i*4))&0xf];
i++;
}
return count;
}
下面是测试程序:
int main(){
int n=20;
for(int i=0;i<n;i++){
unsigned val=rand()%100;
int c1=count_one(val);
int c2=count_one2(val);
int c3=count_one3(val);
cout<<val<<" "<<c1<<" "<<c2<<" "<<c3<<endl;
}
}
int n=20;
for(int i=0;i<n;i++){
unsigned val=rand()%100;
int c1=count_one(val);
int c2=count_one2(val);
int c3=count_one3(val);
cout<<val<<" "<<c1<<" "<<c2<<" "<<c3<<endl;
}
}
具体执行结果如下:
0 0
- 如何判断整数x的二进制中含有多少个1
- 如何判断一个整数位的二进制中有多少个1
- 计算9999的二进制中含有多少个1
- 判断一个整数的二进制数有多少个1
- 计算二进制整数中有多少个1 判断是否为2的n次幂
- 如何获得一个整数的二进制表达中有多少个1?
- 求整数的二进制表达中有多少个1
- 计算一个整数的二进制中有多少个1
- 整数的二进制表示中有多少个1
- 整数的二进制表达中有多少个1
- 如何判断一个数的二进制有多少个1
- 如何判断一个数的二进制有多少个1
- 快速的判断一个数的二进制中有多少个1,快速判断x是不是2^n
- 判断一个整数中有多少个1(二进制)--LeetCode 191
- 判断一个整数的二进制位中有多少个1
- 判断一个整数的二进制位中有多少个1
- 判断任意整数的二进制位中有多少个1
- 输入一个整数,求该整数的二进制表达中有多少个1
- mysql中" ' "和 " ` "的区别
- 全面了解 iOS 静态库开发
- 第3周实践项目--顺序表的基本运算(1)
- 关于while((c = getchar()) != EOF)的使用
- Weblogic启动不输用户名密码
- 如何判断整数x的二进制中含有多少个1
- 如何查看手机的cpu类型是x86还是arm
- CentOS 5.4挂载ISCSI后重启时卡住的解决方法
- iOS 警告收录及科学快速的消除方法
- Android Studio四--Gradle基础
- 已知13个球和一个天平,其中有一个坏球,但是不知道是轻还是重,请用天平秤三次,找到这个坏球。
- 字符溢出分析(数据类型范围以及‘\0’重新认识)
- Android 自定义控件---SpreadView
- 通讯录 CoreData & tabelView