给一个数n,输出它二进制的第k位:
代码:
int n=10;
for(int i=3;i>=0;i--) cout<<(n>>i&1);
lowbit(x);//返回x二进制的最后一个1
int lowbit(int x){
Return x&(~x+1);
}
比如:10的二进制1010,则lowbit(10)=10=2;
再比如:12的二进制1100,则lowbit(12)=100=4;
原理:x&-x=x&(~x+1)
x =1010…10000
~x =0101…01111
~x+1 =0101…10000
X&(~x+1)=0000…10000
即返回了x二进制的最后一个1
例题:AcWing801
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int lowbit(int x){
return x&(~x+1);
}
int main(){
ll n;
cin>>n;
while(n--){
ll x,ans=0;
cin>>x;
while(x){
x-=lowbit(x);
ans++;
}
cout<<ans<<" ";
}
cout<<endl;
return 0;
}
正负数的原码、反码、补码
计算机里面一般用补码去代替反码,目的是将减法计算转化为加法计算。