位运算与进制转换
0. 引言
无言胜万言
1. 位运算
1.1 基本概念
1.1.1 位运算符
首先我们学习位运算的基本概念
| 位运算符 | 含义 | 语法 | 效果 |
|---|---|---|---|
| << | 左移 | a << x | a左移x位 |
| >> | 右移 | a >> x | a右移x位 |
| & | 位与 | a & b | 11得1,其他均为0 |
| | | 位或 | a | b | 00得0,其他均为1 |
| ^ | 位异或 | a ^ b | 相同为0,不同为1 |
| ~ | 位取反 | ~a | 0变1,1变0 |
1.1.2 位运算与二进制
求 nnn 转为二进制的第 kkk 位
n >> k & 1
将 nnn 输出为二进制
for(int k = 32; k >= 0; k--) cout << (n >> k & 1);
1.2 lowbit()的使用
返回 xxx 的最后一位 111
lowbit(int x){
return x & -x;
}
1.2.1 lowbit()详解:
−x=∼x+1-x= \sim x +1−x=∼x+1
例如
x=10100101010000x=10100101010000x=10100101010000
∼x=01011010101111\sim x= 01011010101111∼x=01011010101111
∼x+1=01011010110000\sim x + 1= 0101101 0110000∼x+1=01011010110000
x&−x=00000000010000x \&-x=00000000010000x&−x=00000000010000
1.2.2 例题
求一个数转换为二进制后 111 的个数
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x){
return x & -x;
}
int main(){
int n;
cin >> n;
int ans = 0;
while(n){
n -= lowbit(n);
ans++;
}
cout << ans << endl;
return 0;
}
2. 进制转化(进制 ≤10\le 10≤10 )
一般来说进制转化遵循一下的思路

2.1 PPP 进制转 101010 进制
对于任意一个 anan−1…a3a2a1a_{n}a_{n-1} \dots a_3a_{2}a_1anan−1…a3a2a1 的 PPP 进制的数我们可以通过如下公式转化为 101010 进制的数 yyy
y=a0∗P0+a1∗P1+a2∗P2+a3∗P3+⋯+an−1∗Pn−1+an∗Pn
y=a_0*P^0+a_1*P^1+a_2*P^2+a_3*P^3+\dots +a_{n-1}*P^{n-1} + a_n*P^n
y=a0∗P0+a1∗P1+a2∗P2+a3∗P3+⋯+an−1∗Pn−1+an∗Pn
代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int x;
cin >> x >> p;
int y = 0, product = 1;
while(x){
y += (x % 10) * product;
x = x / 10;
produce *= p;
}
cout << y <<endl;
return 0;
}
2.2 101010 进制转 QQQ 进制
在 101010 进制转化为 QQQ 进制中,我们常常用到短除法例如 151515 转 222 进制中

最终 15=(1111)215=(1111)_215=(1111)2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int z[N];
int main(){
int n, q;
cin >> n >> q;
int num = 0;
do{
z[num++] = n % q;
n = n / 10;
}while(n)
for(int i = num - 1; i >= 0; i--){
cout << z[i];
}
return 0;
}
6574

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



