概念
~ :是非,取反
&:是与
|:或
^:异或,相同取1
>>:右位移位,a>>1,把a的二进制向右移动一位,移动后的直接取0
<<:左移动位
判断奇偶数用&;蛇一个x;当x&1=1是,是奇数,等于0时,是偶数
不用if语句判断求整数的绝对值,x<0? -x:x;
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均值出现一次,每个数组只能访问一次,设计一个算法,将他找出来,不能用辅助数组
以下是代码实现,实现的是1到10的
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
int a[11];
srand(time(0));
for(int i=0;i<10;i++){
a[i]=i+1;
}
//最后一个数是随机数,用随机函数来得到
a[10]=rand()%10+1;
for(int i=0;i<=10;i++)
cout<<" "<<a[i];
cout<<endl;
int x1=0;//任何数和0做异或等于自己
for(int i=1;i<=10;i++){
x1=(x1^i);//1到10的连续异或 ,异或是在二进制上进行的
cout<<x1<<" ";
}
cout<<endl;
for(int i=0;i<11;i++){
x1=x1^a[i];
cout<<x1<<" ";
}
cout<<endl;
cout<<x1<<endl;
return 0;
}
一个数组里除了某个数字之外,其他的数字都出现了两次,请写出程序找出这个出现一次的数字
#include<iostream>
using namespace std;
int main(){
int a[9]={1,1,2,2,3,3,5,4,4};
int b=0;
for(int i=0;i<9;i++){
b=b^a[i];
}
cout<<b<<endl;
return 0;
}
请实现一个函数,输入一个整数,输出该数二进制表示1的个数 思路:思路:先判断该数的二进制表示中最右边是不是1,再把输入的这个整数向右移动一位,此时原来处于右边第二位的数被放在了最右边,在判断是不是1;循环往复,直到输入的数字变为0为止。如何判断最右边位是不是1,我们把输入的整数与1采用按位与运算“&”,可知1的二进制只有最右边是1,按位与运算只有同为真时才为真也就是同为1时结果才为1。如此,输入的整数与1按位与运算结果位1,则表示最右边为1,否则为0.
#include<iostream>
using namespace std;
int main(){
int n;
cout<<"请输入一个正整数:";
cin>>n;
int num=0;//表示1的个数
for(int i=0;i<32;i++){//一个int类型的占4字节312位
if((n>>i)&1==1){//这里就是取出n的二进制移动了i位的最右边的那个数和1与运算
num++;
}
}
cout<<n<<"二进制中的1的个数为:"<<num<<endl;
return 0;
}
解法二
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main(){
char a[100];//用于存储二进制数
int n,i,num=0;
cout<<"请输入你想要求得二进制的整数:";
cin>>n;
itoa(n,a,2);//把整数n转换为二进制数保存在a数组中
for( i=0;i<strlen(a);i++){
if(a[i]=='1'){ //a数组中存的是字符,所以要用''
num++;
}
}
cout<<n<<"中二进制中的1的个数为:"<<num<<endl;
return 0;
}
解法仨
思想:例如10100减去1,就等于10011,然后做个&运算,后面的三位就被消掉了,在减一,就是01111,在做个&运算,就变成0了,做了几次&运算,就有多少个1
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
int count=0;
while(N!=0){
N=((N-1)&N);
count++;
}
cout<<count<<endl;
return 0;
}
判断一个整数是不是2的整数次方
思想:就是判断二进制里面是不是只要一个1
if(((N-1)&N)==0)//这一条语句就可以判断