位运算

概念

~ :是非,取反
&:是与
|:或
^:异或,相同取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)//这一条语句就可以判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值