判断奇数偶数:
//只有2的0次方才是奇数值1,其他的2的k(k = 1,2,….)都是偶数,
//所以只需要判断最后一位是1还是0
#include <iostream>
using namespace std;
int main()
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
if(a & 1)
cout << "是奇数" << endl;
else
cout << "是偶数" << endl;
}
获取二进制位是0还是1:
//整数35的第六位是0还是1(从右往左数)
#include<iostream>
using namespace std;
int main(){
int a = 35;//二进制是00100011
int temp = (a & (1 << 5) >> 5);
//00100011 & 00100000 = 00100000,00100000 >> 5 = 001 = 1;
cout << "整数35的第六位是:" << temp << endl;
return 0;
}
交换两数:
#include<iostream>
using namespace std;
int main(){
int a = 20, b = 14;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << a <<endl;
cout << b << endl;
return 0;
}
题目 1:
解题思路:
a ^ a = 0, b ^ 0 = b;异或常用来去重。
a ^ a ^ b ^ c ^c = b;
//方便起见,假设1-10中十个数有一个重复的;
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> a(11);
for (int i = 0; i < 10; i++){
a[i] = i + 1;
}
a[10] = 8;//重复的是8;
int x = 0;
for (int i = 1; i <= 10; i++)
x = x ^ i;//0^1^2.....^10
for (int i = 0; i < 11; i++)
x = x ^ a[i];//=>0^重复的数字=>重复的数字
cout << "重复的数字为:" << x << endl;
return 0;
}
如果没有前提条件:1-1000这……只能通过暴力搜索,开辟数组统计每个元素出现的次数
题目2:
题目3:
方法一:统计各个位上的1的个数(因为是整数,所以最多位32位)
#include<iostream>
using namespace std;
int main(){
int a = 35;
int count = 0;
for (int i = 0; i < 32; i++){
if((a & (1 << i)) >> i)
count++;
}
cout << "二进制中1的个数为:" << count << endl;
return 0;
}
方法二:x & (x - 1)==消掉最低位的1;例如10010(18)- 1 = 10001(17),10010&10001=10000,等价于把10010的最后一个1变为了0;
#include<iostream>
using namespace std;
int main(){
int a = 35;
int count = 0;
while (a != 0){
a = a & (a - 1);
count++;
}
cout << "二进制中1的个数为:" << count << endl;
return 0;
}
题目4 :
思路:一个数如果是2的整数次方,则该数的二进制位上只有1个1.
题目5:
本题思路:
假设一个数的二进制为yxyxyx,将该数与010101相与得到0x0x0x(记作c),再将该数与101010相与得到y0y0y0(记作d),将c与d异或得原数即yxyxyx;观察可得将c左移一位得到x0x0x0记作(e),将d右移一位得到0y0y0y(记作f);此时将e和f异或,得到xyxyxy;
题目6:
思路:乘基取整
题目7:
本题思路:两个相同的2进制做不进位加法时,结果为0;
10相同的10进制数做不进位的加法时,结果为0;
k个相同的k进制数做不进位加法时,结果为0.
#include<iostream>
#include<algorithm>
//#include<cmath>
using namespace std;
//十进制数转K进制
string decTok(int dec,int k){
string ret=""; //作为结果
while(dec>0){
ret+=char(dec%k+'0'); //如:5+'0'='5'
dec/=k;
}
reverse(ret.begin(),ret.end());
return ret;
}
//K进制转十进制
int kTodec(string str,int k){
int ans=0;
for(int i=0;i<str.size();i++){
ans=ans*k+(str[i]-'0'); //020 首位是最高位
//ans+=(str[i]-'0')*pow(k,str.size()-1-i);
}
return ans;
}
int main(){
int n[]={1,1,1,3,3,3,5,5,5,9,9,9,6,7,7,7};
int k=3;
string str[16];
for(int i=0;i<16;i++){
str[i]=decTok(n[i],k);
}
//找出16条字符串中最大长度
int maxlen=0;
int len;
for(int i=0;i<16;i++){
len=str[i].size();
maxlen=max(maxlen,len); //不能用: maxlen=max(maxlen,str[i].size())
}
//16条字符串中,若字符串长度<maxlen,则进行补齐,以便逐位做不进位加
for(int i=0;i<16;i++){
while(str[i].size()<maxlen){
str[i]="0"+str[i];
}
}
//ans:结果。初始化
string ans="";
while(ans.size()<maxlen){
ans+="0";
}
//16条字符串做不进位加
for(int i=0;i<16;i++){
for(int j=0;j<maxlen;j++){
ans[j]=char(((str[i][j]-'0')+(ans[j]-'0'))%k+'0');
}
}
cout<<ans<<endl;
//ans字符串结果转为10进制数
int finalans=kTodec(ans,k);
cout<<finalans<<endl;
return 0;
}