一、十进制的二进制输出
#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;
}
}