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;

三、注意事项

  1. 进制转换时注意处理非法输入(如base=16时出现'G'字符)
  2. 位运算优先级较低,建议多用括号
  3. 右移符号位处理:有符号数右移补符号位(算术右移),无符号数补0
  4. 大数处理建议使用long long类型
  5. 浮点数不支持位运算(需用reinterpret_cast处理)
// 浮点位操作(特殊用途)
float f = 3.14f;
int binary = reinterpret_cast<int&>(f);

章节 1. x进制转10进制

开放

题目 尝试 AC 难度
P263   练43.1十进制转八进制 4 1 10
P264   练43.2十进制转十六进制 10 1 10
P265   练43.3算进制 0 0 (无)

章节 2. 10进制转x进制

开放

题目 尝试 AC 难度
P270   练44.2 二进制转化为十进制 0 0 (无)
P271   练44.3 二进制串 0 0 (无)

章节 3. 位运算

开放

题目 尝试 AC 难度
P266   【例44.1】 输出二进制补码 1 1 10
P267   【例44.2】 1的个数 1 1 10
P273   【例45.2】 筷子大作战 3 1 10
P274   【例45.3】 寻找最低数 1 1 10
P275   【例45.4】 数位翻转 2 1 10