c++ 二进制相关的几个操作

一、十进制的二进制输出

#include<iostream>
//十进制的二进制输出, 
using namespace std;
int main()
{
	unsigned x;
	cin>>x;
//	x=x-((x^(x+1))>>1); //尼玛!!!!!今年蓝桥杯的一个填空题55555555555555555555.。。。
                            // 作用,若数的末尾是连续的1,将连续的1变为0; 
	cout<<"x="<<x<<endl;
	for(int i=0;i<32;i++) 
	{
		cout<<(x>>(31-i)&1);
		//x=x>>1;
	}
	x=x-((x^(x+1))>>1); 
	cout<<endl;
	cout<<"x="<<x<<endl;
	for(int i=0;i<32;i++) 
	{
		cout<<(x>>(31-i)&1);
		//x=x>>1;
	}
	
 }

140557_dvnA_1755428.png

二、统计二进制串中1的个数

//计算一个数的二进制中,1的个数
#include<iostream>
using namespace std;
int countOf1(int num)
{
	int count = 0;
	unsigned flag=1;
	while(flag)
	{//flag相当于一个游标,num是一把尺子,每一次flag向左移动一位,与num的对应位进行与运算。 
		if(num&flag)
		{
			count++;
		}
		flag<<=1;
	}
	return count;
 } 
 
 int countOf1_2(int num)
 {//将该数减去1,可以将最右边的1变为0,若该1的位置右边还有0,则将右边所有的0变为1,与原数进行与运算,即可将原数最右边的1消去,而其它位保持不变。
 //例如,7的二进制表示是111,
 //减1操作后变为110,与原数与运算结果为110,
 //减1操作后变为101,与原数与运算结果为100
 //减1操作后变为011,与原数与运算结果为000 
 //一共进行了三次运算,每一次消去一个1,故总共有3个1.
 //毕。 
	unsigned count = 0;
 	while(num)
 	{
 		num=num&(num-1);
 		count++;
	 
	 }
	 return count;
 }
 int main()
 {
 	int n;
 	while(cin>>n)
 	{
 		cout<<countOf1(n)<<endl;
 		cout<<countOf1_2(n)<<endl;
	 }
	 if(!cin.bad())
	 	cout<<"error input!";
	 cin.clear();
	 return 0;
  }

141227_sGiJ_1755428.png

三、判断一个数是否是2的n次方

//判断一个数是否为2的n次方,一个数的n次方,那么只有最高位是1,其余位是0,可
//以利用num=num&(num-1);消去一个1,判断num是否为0 
#include<iostream>
 using namespace std;
 bool is2power(int num)
 {
 	bool flag = true;
 	num = num&(num-1);
 	if(num)
 	{
 		flag = false;
	 }
	 return flag;
 }
 int main()
 {
 	int n;
 	while(cin>>n)
 	{
 		cout<<is2power(n)<<endl;
 		
	 }
	 return 0;
 }


141608_F5fA_1755428.png

四、求最大int值

//求最大int值
#include<iostream>
using namespace std;
int getMaxInt_1()
{
	return (1<<sizeof(int)*8-1)-1;
}
/*
int getMaxInt_2()
{
	return (1<<-1)-1;
}
《c++ primer》中规定左移,右移右侧的运算对象一定不能为负,而且值必须严格小于结果的位数。 
*/

int getMaxInt_3()
{
	return ~(1<<sizeof(int)*8-1);//取反操作与减1操作的效果是一样的。 
 } 
 int getMaxInt_4()
 {
 	return (unsigned)(-1)>>1;//(unsigned)(-1)是unsigned的最大表示值。 
  } 
  
  int getMinInt_1()
  {
  	return 1<<sizeof(int)*8-1;
   } 
   /*
   //同样右侧的值不能为负值 
   int getMinInt_2()
   {
   	return 1<<-1;
   }
   */
int main()
{
	cout<<"1\t"<<getMaxInt_1()<<endl;
//	cout<<"2\t"<<getMaxInt_2()<<endl;
	cout<<"3\t"<<getMaxInt_3()<<endl;
	cout<<"4\t"<<getMaxInt_4()<<endl;
	
	cout<<"1\t"<<getMinInt_1()<<endl;
	return 0;
 }

141828_9J9d_1755428.png

五、m经过多少次变换可以变成n

// 求m经过多少次变换(1变为0或者0变为1为一次运算)可以变化为n,
 #include<iostream>
 using namespace std;
 int countChange(int n,int m)
 {
 	int count=0;
 	n=n^m;//求m与n有多少位不相同
	 while(n)
	 {//计算n中1的个数 
	 	n=n&(n-1);
	 	count++;
	  } 
	  return count; 
  } 
  int main()
  {
  	int m,n;
  	while(cin>>m>>n)
  	{
  		cout<<countChange(m,n)<<endl; 
	  }
   }

142104_7tNZ_1755428.png

六、判断一个数的奇偶性

//判断一个数是否为偶数,看最后一位是0还是1,
#include<iostream>
using namespace std;
bool isOdd(int num)
{
	return num&1==1;
 } 
 int main()
 {
 	int n;
 	while(cin>>n)
 	{
 		cout<<isOdd(n)<<endl;
	 }
 }

142444_EhAi_1755428.png

七、交换两个数

//交换两个数
//一个数m与另一个数n异或,再与n异或,得到的结果是m
/*
 a=a^b;
 b=b^a;
 a=a^b
 */ 
 #include<iostream>
 using namespace std;
 void mySwap(int&a,int&b)
 {
 	a^=b^=a^=b;
 }
 int main()
 {
 	int m,n;
 	while(cin>>m>>n)
 	{
 		cout<<"m= "<<m<<"\t"<<"n= "<<n<<endl;
 		mySwap(m,n);
 		cout<<"m= "<<m<<"\t"<<"n= "<<n<<endl;
	 }
	 return 0;
 }

142706_GG4D_1755428.png

八、求绝对值

//求一个数的绝对值 
#include<iostream>
using namespace std;
int myAbs(int n)
{
	return (n^n>>31)-(n>>31);
}
int main()
{
	int m;
	while(cin>>m)
	{
		cout<<myAbs(m)<<endl; 
	}
	return 0;
}

143025_PU9B_1755428.png

九、求平均数

//求平均数 
/*
	第一种方法较为普遍且简单。第二种方法,需要知道的是,( m ^ n ) >> 1得到的结果是m和n其中一个数的位为1的
	值的一半,m & n得到的结果是m 和n都为1的那些位,两个结果相加得到m和n的平均数。
*/ 
#include<iostream>
using namespace std;
int getAverage(int m,int n)
{
	return (m+n)>>1;
}
/*
	求m和n的平均数
	(m^n)>>1  获得两个数中,只有其中一个数的位为1的一半
	m&n 获得m和n两个数中都为1的某些位。 
	*/
int getAverage_2(int m,int n)
{
	return ((m ^ n) >> 1) + (m & n); 
 } 
 int main()
 {
 	int m,n;
 	while(cin>>m>>n)
 	{
 		cout<<getAverage(m,n)<<endl;
 		
 		cout<<getAverage_2(m,n)<<endl;
	 }
	 return 0;
 }

143310_X5u0_1755428.png

十、求二进制位的第m位

#include<iostream>
using namespace std;
/*
	求倒数第m位
*/
int  getMthByTail(int n,int m)
{
	return (n>>(m-1))&1;
}
/*
	将第m位设为1 
*/
int setMthByTailTo1(int n,int m)
{
	return n|(1<<(m-1));
}
/*
	将第m位设为0 
*/ 
int setMthByTailTo0(int n,int m)
{
	return n&~(1<<(m-1));
 } 
int main()
{
	int n,m;
	while(cin>>n>>m)
	{
		cout<<getMthByTail(n,m)<<endl;
		cout<<setMthByTailTo1(n,m)<<endl;
		cout<<setMthByTailTo0(n,m)<<endl;
	}
}

143546_L8Yg_1755428.png


转载于:https://my.oschina.net/u/1755428/blog/647699

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值