我又来水文章了!
众所周知,c++中的位运算是一种极其不易驯服掌握的运算,所以今天就来盘点一下c++的位运算(文末有进制转换的代码和注释)
大纲
中间的是示例
左移:<< 1001010<<2=0101000 所有位向左移(有溢出)
右移:>> 1001010>>2=0010010 所有位向右移(有溢出)
按位与:& 1001010&1000010=1000010 两数同位都为1则为1
按位或:| 1001010|1100101=1101111 两数同位有1则为1
按位异或:^ 1001010^1000101=0001111 两数同位不同则为1
按位取反:~ ~1001010=0110101 0变1,1变0
注意点
使用左移(<<)和右移(>>)是数据会溢出或补充,什么意思呢?用左移举个栗子
100100100<<2,就是把100100100左移2位
左移前:
100100100
左移:
10010010000
红色部分溢出了,将被移出数字,绿色的两个0是被补充的数字
所以最终的结果是:
010010000
按位与、按位或、按位异或用竖式表示会更清楚,下面用按位与举例
101010001010
& 100010101000
-------------------------------
100010001000
处在同一列上的数字如果都是1,那么在结果中这一位就是1(标红了)
按位取反符号“~”在需要处理的数字前,前面不需要任何数字
福利
赠送一个进制转换的代码(含注释)
#include<bits/stdc++.h>
using namespace std;
int n,m; //n是输入的数字的进制,m是需要转换为的进制
string a,b; //a是转换前的数字,b是转换后的数字
int to10(string a) //把输入的n进制数转换为10进制
{
int num=0;
for(int i=0;i<a.size();i++)
{
if(a[i]>='0' && a[i]<='9')
{
num=num+(a[i]-'0')*pow(n,a.size()-i-1);//按位权值转换为十进制
}
else
{
num=num+(a[i]-55)*pow(n,a.size()-i-1);
}
}
return num;
}
void tom(int num) //把处理出的10进制数转换为m进制(是个递归)
{
if(num!=0)
{
int yu=num%m; //短除法转换为m进制
tom(num/m);
char c;
if(yu<10)
{
c+=yu+'0';
}
else
{
c+=yu+55;
}
b+=c;
}
}
int main()
{
cin>>n;
cin>>a;
int num=to10(a);
cin>>m;
tom(num);
cout<<b;
return 0;
}
如果你点赞,我会很开心
本文详细介绍了C++中的位运算符,包括左移、右移、按位与、按位或、按位异或和按位取反等,并通过实例进行说明。此外,还提供了一个进制转换的代码示例。
1559

被折叠的 条评论
为什么被折叠?



