进制转换与位运算

其他进制转10进制

image 进制转换与位运算 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进制转为其他进制

image 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;
}
``

0 条评论

目前还没有评论...