先想一下,如果要给你一个数对应的补码形式,你要计算这个数的1的数目,你有几种做法呢(针对负数的补码也是否能够计算呢):
3种思路分享给你:
整完看看后面的思考题,c一下
first.
void One(unsigned int n){ //unsigned的运用
int cnt=0;
while(n>0){
if((n%2==1))
cnt++;
n /= 2;
}
cout << cnt << endl;
}
unsigned保证负数也可求解。
second.
void One(int n){
int cnt = 0;
for(int i = 0; i < 32;i++)
if (((n>>i) & 1 == 1))
cnt++;
cout << cnt << endl;
}
通过遍历整数n
的每一位,并检查每一位是否为1,来计算并输出整数n
的二进制表示中1的个数。
方法是高效的,只需要进行32次操作(对于int),而不需要进行多次除法或模运算。
牛的总在最后出现:
third.
void One(int n){
int cnt = 0;
while(n){
n = n & (n - 1);
cnt++;
}
cout << cnt << endl;
}
通过不断将n
与n - 1
进行按位与操作,每次操作都会消除n
最右边的1,直到n
变为0。每次消除一个1,cnt
就增加1。这种方法同样高效,因为它只需要进行与1的个数相等的次数操作,就能计算出整数n
的二进制表示中1的个数。
代码简短,而韵味悠长!
看看实际应用:
如何判断一个数是不是2的倍数?
//例题:判断是否是2的次方数
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
if(n&(n-1)==0)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
把一个数补码的第五位置置1,然后在此基础上返回来再输出
//例题:把一个数的第五位置为1,然后再返回来,同时进行两次输出
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
n = n | (1 << 4);
cout << n << endl;
n &= ~(1 << 4);
cout << n << endl;
return 0;
} //鹏哥的失误,恰13有效
鹏哥在视频课中有一点失误,恰恰举的例子不影响结果,我把算法改过来了
标签:cnt,cout,绝佳,int,void,unsigned,++,移位,运算 From: https://blog.csdn.net/FENGCHEN____/article/details/139451591