文档章节

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

lench
 lench
发布于 2016/03/26 14:37
字数 1267
阅读 315
收藏 0

一、十进制的二进制输出

#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;
	}
	
 }

二、统计二进制串中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;
  }

三、判断一个数是否是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;
 }


四、求最大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;
 }

五、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; 
	  }
   }

六、判断一个数的奇偶性

//判断一个数是否为偶数,看最后一位是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;
	 }
 }

七、交换两个数

//交换两个数
//一个数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;
 }

八、求绝对值

//求一个数的绝对值 
#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;
}

九、求平均数

//求平均数 
/*
	第一种方法较为普遍且简单。第二种方法,需要知道的是,( 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;
 }

十、求二进制位的第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;
	}
}


© 著作权归作者所有

lench
粉丝 2
博文 5
码字总数 4592
作品 0
长春
私信 提问
小小换行符乱谈(文本文件vs二进制文件)

使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含 "b" 使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含 "binary" 使用 python 的 op...

晨曦之光
2012/05/08
547
0
C++ 跨平台多功能扩展库 - cpgf

cpgf 可为C++代码增加反射(元数据)、序列化、以及Luau和Python脚本绑定等功能,且不依赖任何外部工具。 cpgf 的目标是扩展C++语言,其中包含许多易于使用的功能,这些功能仅在其他更高级别...

wqking
2018/09/17
722
4
C++的可移植性和跨平台开发

概述   今天聊聊C++的可移植性问题。如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列。即使你目前没有跨平台开发的需要,了解可移植性方面的...

kelly
2014/01/03
1K
0
VC 运行时库中的 new/delete 函数

原文:VC 运行时库中的 new/delete 函数 作者:Breaker Windows VC CRT 运行时库中导出的 new/delete 二进制接口 目录 缘起 CRT 的动态链接模块 使用 msvcr[ver].dll 导出的 new 头文件和模块...

晨曦之光
2012/05/23
736
0
为什么 Windows Phone 7 不支持C++

//===================================== //TITLE: // 为什么Windows Phone 7不支持C++? //AUTHOR: // norains //DATE: // Thursday 5-August-2011 //Environment: // Windows Phone 7 //=......

鉴客
2011/11/23
772
3

没有更多内容

加载失败,请刷新页面

加载更多

数据流中的中位数

参考:https://sunweiguo.github.io/2019/03/18/%E5%89%91%E6%8C%87offer/%E3%80%90%E9%9D%A2%E8%AF%95%E9%A2%9863-%E6%95%B0%E6%8D%AE%E6%B5%81%E4%B8%AD%E7%9A%84%E4%B8%AD%E4%BD%8D%E6%95......

Garphy
13分钟前
4
0
微服务下配置管理中心 SCCA

SCCA 简介 SCCA 全称 spring-cloud-config-admin,微服务下 Spring Boot 应用(包含 Spring Cloud)统一的配置管理平台。 Github 地址:spring-cloud-config-admin 核心贡献者:程序员DD | ...

SpringForA
15分钟前
5
0
spring 是如何注入对象的和bean 创建过程分析

文章目录: beanFactory 及 bean 生命周期起步 BeanFactory refresh 全过程 BeanFactoryPostProcessor 和 BeanPostProcessor 解析 使用 BeanPostProcessor 实现 aop 和 springboot Cache 相关......

sanri1993
18分钟前
8
0
@PathVariable使用

public interface ProductInfoRepository extends JpaRepository<ProductInfo, String>{ List<ProductInfo> findByProductId(String productId);} ProductInfoController @Autowired ......

观海562
29分钟前
6
0
利用CSS禁止手机长按出现气泡: 复制、选择等功能

可以用 * ,也可作用于一个div div{  -webkit-touch-callout:none;  /*系统默认菜单被禁用*/  -webkit-user-select:none; /*webkit浏览器*/  -khtml-user-select:none; /*早期浏览...

蓝小驴
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部