C++&数学
一、进制转换
1. 十进制转 x x x 进制的方法
【整数部分】 除 x x x 倒取余
- 将 10 10 10 进制数不断除以 x x x,得到商和余数。
- 如果除到 0 0 0 了,那么将余数逆序输出就是结果。
【小数部分】 乘
x
x
x 正取整
3. 将
10
10
10 进制数得小数部分不断乘
x
x
x,得到积和整数部分。
4. 如果乘得了整数或者题目要求的精度,那么将整数部分顺序输出就是结果。
【AC Code】
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n, x;
string ans;
string dict = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main()
{
cin >> n >> x;
while (n)
{
ans += dict[n%x];
n /= x;
}
reverse(ans.begin(), ans.end());
cout << ans;
return 0;
}
2. x x x 进制转十进制的方法
【不分整小】 按权展开求和
- 将给定的 x x x 进制数从左到右逐位乘对应的位权,得到相应的 10 10 10 进制数。
- 将各个积求和,得到转换后的 10 10 10 进制数。
【AC Code】
给大家介绍一种懒人函数:
#include <charconv> // 必须导入的头文件
from_chars(InputIt first, InputIt last, T& value, int base=10);
// 将一个字符数组 first 和 last(开始和结束迭代器的区间范围内,并且已知这个区间的进制是 x 进制),将十进制的结果存储在 value 中
#include <iostream>
#include <charconv>
#include <cstring>
using namespace std;
int x, ans;
char n[101];
int main()
{
cin >> x >> n;
from_chars(n, n+100, ans, x);
cout << ans;
return 0;
}
二、位运算
1. 按位与 &
例题: ( 1101101 ) 2 & ( 101001 ) 2 = ( 0101001 ) 2 (1101101)_2 \& (101001)_2=(0101001)_2 (1101101)2&(101001)2=(0101001)2
数字1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|
数字2 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
结果 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
技巧:全 1 1 1 则 1 1 1,一 0 0 0 则 0 0 0
2. 按位或 |
例题: ( 1101101 ) 2 ∣ ( 101001 ) 2 = ( 1101101 ) 2 (1101101)_2 | (101001)_2=(1101101)_2 (1101101)2∣(101001)2=(1101101)2
数字1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|
数字2 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
结果 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
技巧:全 0 0 0 则 0 0 0,一 1 1 1 则 1 1 1
3. 按位异或 ^
例题: ( 1101101 ) 2 (1101101)_2 (1101101)2 ^ ( 101001 ) 2 = ( 1000100 ) 2 (101001)_2=(1000100)_2 (101001)2=(1000100)2
数字1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|
数字2 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
结果 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
技巧:不同则 1 1 1,否则为 0 0 0
4. 按位取反 ~
例题: ( 1101101 ) 2 = ( 0010010 ) 2 ~ (1101101)_2=(0010010)_2 (1101101)2=(0010010)2
数字 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|
结果 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
技巧: 1 1 1 则 0 0 0,否则为 1 1 1
5. 按位左移 <<
例题:
(
1101101
)
2
<
<
(
2
)
(1101101)_2 << (2)
(1101101)2<<(2)
10
10
10
=
(
110110100
)
2
=(110110100)_2
=(110110100)2
技巧:左移
n
n
n 位就添
n
n
n 个
0
0
0
6. 按位右移 >>
例题:
(
1101101
)
2
>
>
(
2
)
(1101101)_2 >> (2)
(1101101)2>>(2)
10
10
10
=
(
0011011
)
=(0011011)
=(0011011)
2
2
2
技巧:右移
n
n
n 位就取前
n
n
n 位
三、原码反码补码
我们知道,计算机中的数分为有符号数(signed
,可以表示正数、负数和
0
0
0)和无符号数(unsigned
,只能表示正数和
0
0
0)。
1. 原码
对于有符号数而言,规定最高位是符号位, 0 0 0 表示正数, 1 1 1 表示负数,非符号位是该数字绝对值的二进制。
2. 反码
规定正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(原码)不变。
3. 补码
规定正数的补码与原码一致,负数的补码对反码 + 1 +1 +1(不看原码)。
四、指针地址
程序 | 作用 |
---|---|
int &a = b; | 表引用 |
&p | 取地址 |
int *p; | 定义指针 |
*p | 获取值 |
黑客园地 Hacker’s Den
当你调用函数的时候,可以这么写。int func() { ... } int main() { int (*f)() = func; int ans = f(); return 0; }
#include <iostream>
using namespace std;
int main()
{
int x = 100;
int *p = &x; // 定义一个指向 x 地址的指针 p
int &y = x;
cout << &x << " " << p << endl; // 两种获取 x 地址的方法
*p = 5; // 间接修改 x 的值为 5
cout << *p << " " << x << " " << y; // 三种获取 x 值的方法
return 0;
}