1.x进制转10进制
2.10进制转x进制
3.位运算
登录以参加训练计划
# C++ 进制转换与位运算整理
---
## 一、进制转换
### 1. X进制转10进制
#### (1) 标准库函数
```cpp
long strtol(const char* str, char** endptr, int base);
- 参数:
str
:要转换的字符串endptr
:指向首个无效字符的指针base
:原始进制(2-36)
- 示例:
char str[] = "1A"; long num = strtol(str, NULL, 16); // 26
(2) 手动实现
int toDec(string s,int base){
int len=s.size();
int res=0;
int i=0;
while(len-1>=0){
if(s[len-1]>='A') s[len-1]=s[len-1]-'A'+10+'0';
res+=(s[len-1]-'0')*pow(base,i);
i++;
len--;
}
return res;
}
// 示例:toDec("1A", 16) → 26
2. 10进制转X进制
(1) 手动实现
string decToX(int num, int base) {
if(num == 0) return "0";
string digits = "0123456789ABCDEF";
string res;
while(num > 0) {
res.push_back(digits[num%base]);
num /= base;
}
reverse(res.begin(), res.end());
return res;
}
// 示例:decToX(26, 16) → "1A"
二、位运算
1. 基本运算符
运算符 | 说明 | 示例 |
---|---|---|
& |
按位与 | 0b1010 & 0b1100 = 0b1000 |
` | 按位或 | |
^ |
按位异或 | 0b1010 ^ 0b1100 = 0b0110 |
~ |
按位取反 | ~0b1010 = 0b0101(实际结果与位数有关) |
<< |
左移 | 0b0011 << 2 = 0b1100 |
>> |
右移 | 0b1100 >> 2 = 0b0011 |
2. 常用技巧
// 判断奇偶
bool isOdd = num & 1;
// 交换两数
a ^= b; b ^= a; a ^= b;
// 取最低有效位
int lsb = num & -num;
// 二进制1的个数
int count = __builtin_popcount(num); // GCC扩展
// 判断2的幂
bool isPowerOfTwo = (num & (num-1)) == 0;
3. 位掩码操作
// 设置位
num |= (1 << n); // 设置第n位
// 清除位
num &= ~(1 << n); // 清除第n位
// 切换位
num ^= (1 << n); // 切换第n位状态
// 检查位
bool bit = (num >> n) & 1;
三、注意事项
- 进制转换时注意处理非法输入(如base=16时出现'G'字符)
- 位运算优先级较低,建议多用括号
- 右移符号位处理:有符号数右移补符号位(算术右移),无符号数补0
- 大数处理建议使用
long long
类型 - 浮点数不支持位运算(需用
reinterpret_cast
处理)
// 浮点位操作(特殊用途)
float f = 3.14f;
int binary = reinterpret_cast<int&>(f);
- 参加人数
- 3
- 创建人