- 分享
进制转换与位运算
- 2023-5-30 12:23:50 @
进制转换与位运算
其他进制转10进制
进制转换与位运算 1.进制转换 其他进制转为10进制 假设是从p进制的abcd转为10进制 从低位开始依次乘上p的0,1,2,3次方 = dp^0 + cp^1 + bp^2 + ap^3; (任何数的0次方都是1) 例如8进制的123转为10进制 = 38^0 + 28^1 + 18^2 = 31 + 28 + 164 = 83 牛刀小试: 4进制2451转为10进制 2进制11011101转为10进制 8进制54263转为10进制 3进制120112转为10进制 12进制AB23转为10进制(当进制是11进制以上的某一位是10以上的用字母表示,不然不能区分10是一位还是两位1和0) A:10 B:11 C:12 以此类推 16进制FAB8转为10进制
我们先进行手算,然后根据原理写出代码来验证
其他进制转10进制的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string n; int p;//输入的是字符串n 它是p进制
cin >> n >> p;
long long m = 0;//存储最终转为的10进制
int k = 0;//用来表示当前应该乘上p的几次方
for(int i = n.size() - 1;i >= 0;i--)//从后面的低位开始
{
if(n[i] >= 'A' && n[i] <= 'Z')//如果是字母说明这一位是>= 10的
{
m += int(10 + n[i] - 'A')*pow(p,k);
}
else{
m += (n[i] - '0')*pow(p,k);
}
k++;
}
cout << m;
return 0;
}
对于的一个题目进制转换
10进制转为其他进制
2. 10进制转为其他进制 例如要把10进制n转为p进制, 每次先拿10进制n对p取余,然后n = n/p; 重复上面的步骤直到n = 0 余数倒过来取就是我们的答案了 10进制123转为8进制
123%8 = 3 123/8 = 15
15%8 = 7 15/8 = 1
1%8 = 1 1/8 = 0
173就是我们的结果
10进制123转为16进制
123%16 = 11(B),余数>=10我们用大写字母表示 123%16 = 7
7%16 = 7 7/16 = 0
7B就是我们得到的16进制 牛刀小试 请把10进制123转为6进制 把10进制5213转为16进制 把10进制6235转为13进制 把10进制1024,512,256,128,64依次转为2进制 把10进制245转为7进制 先进行手算,然后根据原理写出对应代码验算一下
既然我们余数是倒过来取的,我们可以把每次得到的余数放入数组, 最后逆序输出就是答案了
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int n,p;//分别是10进制n和要转的进制p
cin >> n >> p;
int d = 1;//作为当前余数要放入数组的下标
while(n != 0)//n!=0的时候我们取余然后n = n/p
{
a[d] = n%p;
d++;
n = n/p;
}
for(int i = d - 1;i >= 1;i--)
{
if(a[i] >= 10)
{
cout << char('A' + a[i] - 10);
}
else{
cout << a[i];
}
}
return 0;
}
位运算
C++中的位运算就是直接对整数在内存中的二进制位进行按位操作
1. &(按位与) 只有一个取地址符不是逻辑运算符&&
两个数进行按位与运算时,对应二进制位同时是1返回1,否则返回0
例如:5&6
5和6的二进制分别是101和110
5&6 =
101
&110
----
100
算出43666&2351的值
6012&78的值
2.| 按位或
两个数进行按位与运算时,对应二进制位有一个1以上返回1,都是0的时候返回0
6和8的二进制分别是0110和1000
6|8 =
0110
|1000
------
1110
算出64|63的值
431|85
3.^按位异或
两个数进行按位与运算时,对应二进制位不相同返回1,否则返回0(同0异1)
5和9的二进制分别是0101和1001
5^9 =
0101
^1001
-----
1100
算出127^127
987^134
4.左移运算符
二进制位整体左移地位补0
5的2进制101
5 << 1 = 1010(10)
5 << 2 = 10100(20)
一个数左移n位就是乘上2^n
5.右移运算符
二进制位整体右移
5的2进制101
5>>1 = 10
5>>2 = 1
一个数右移n位就是除上2^n下取整
### 2进制转16进制
#include<bits/stdc++.h>
using namespace std;
int a[260];
int main()
{
int n;
cin >> n;
for(int t = 1;t <= n;t++)
{
string s;
cin >> s;
int l = s.size();
if(l%4 != 0)//考虑2进制位个数不是4的倍数 前面补0
{
int k = l%4;
for(int i = 1;i <= 4 - k;i++)//最高位
s = '0' + s;
}
int k = 0,d =0,p = 0;//k当前16进制数,d当前数组下标,p当前取了多少个2进制位
for(int i = s.size() - 1;i >= 0;i--)
{
// 1010
k = k + (s[i] - '0')*pow(2,p);
p++;
if(p == 4)//取够4个2进制位,得到1个16进制 存储到数组
{
a[d] = k;
k = 0;
p = 0;
d++;
}
}
for(int i = d - 1;i >= 0;i--)
if(a[i] >= 10)
{
cout << char(a[i] - 10 + 'A');
}
else{
cout << a[i];
}
cout << endl;
}
return 0;
}
首字母变大写
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
if(s[0]>='a'&&s[0]<='z')
{
cout <<char(s[0]-32);
}
else{
cout << s[0];
}
for(int i=1;i<s.size();i++)
{
if(s[i-1]==' '&&s[i]>='a'&&s[i]<='z')
{
cout <<char(s[i]-32);
}
else{
cout <<s[i];
}
}
cout <<endl;
}
return 0;
}
``