第一种情况代码:
int main(){
int n=10;
//">>"右移运算 1010 右移3位 0001
// 1010 右移2位 0010
// 1010 右移1位 0101
// 1010 右移0位 1010
//"&" 按位与运算 0001 & 0001 = 1
// 0010 & 0001 = 0
// 0101 & 0001 = 1
// 1010 & 0001 = 0
for(int k=3;k>=0;k--){
cout<<(n>>k&1);
}
}
第二种情况代码:
例题:二进制中1的个数
给定一个长度为 𝑛 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 𝑛。
第二行包含 𝑛 个整数,表示整个数列。
输出格式
共一行,包含 𝑛 个整数,其中的第 𝑖 个数表示数列中的第 𝑖 个数的二进制表示中 1 的个数。
数据范围
1≤𝑛≤100000,
0≤数列中元素的值≤10的9次方
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
上代码(主要是lowbit的应用):
#include<iostream>
using namespace std;
//返回最后1位,例如0110 返回0010
int lowbit(int x){
return x & -x;
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
int res=0;
//减去最后1位 例如2 -> 0010 返回也是0010 所以2-2=0,res=1;
while(x) x-=lowbit(x),res++;
cout<<res<<" ";
}
}
这里稍微涉及到原码反码补码的应用,对于正数来说三码合一,负数的话,反码是原码取反,补码是反码上+1。