【C++】进制

一、进制转换

1、十进制转二进制

如十进制34转为二进制:
34/2=17······0
17/2=8·······1
8/2=4········0
4/2=2········0
2/2=1········0
1/2=0········1
得到34二进制:0010 0010

2、十进制转八进制(同上)

3、二进制转八进制

从低位开始,将二进制数每三位一组,转成对应八进制数

4、二进制转十六进制

从低位开始,将二进制数每四位一组,转成对应十六进制数

5、八进制转二进制

八进制数每一位,转成对应的一个三位二进制数

6、十六进制转二进制

八进制数每一位,转成对应的一个四位二进制数

二、位运算

1、原码、反码、补码

二进制中,最高位符号位:0表示正数,1表示负数。
正数:原码、反码、补码相同(三码合一)
负数:

  1. 负数反码=原码符号位不变,其他位取反
  2. 负数补码=反码+1 (负数反码=补码-1)
-2的原码:
10000000 00000000 00000000 00000010
-2的反码:
11111111 11111111 11111111  11111101
-2的补码:
11111111 11111111 11111111 11111110

2、位运算符

C++一共有6个位运算符(&、|、^、~、>>、<<)
3. 按位与&
4. 按位或|
5. 按位异或^:两位一个为0、一个为1,结果为1,否则为0;
6. 按位取反~
7. 算数右移>>:低位溢出,符号位不变,用符号位补溢出高位
本质上:右移1位,等价于/2
8. 算数左移<<:符号位不变,低位补0
本质上:左移1位,等价于2*

3、变换操作

1.题目:二进制中1的个数

int NumberOf1(int n) {
       int count = 0;
       while(n!= 0){
           count++;
           n = n & (n - 1);
        }
       return count;
   }

对于一个不为0的整数,其二进制至少有1位为1。令其-1,则该整数自右往左第一个1变为0,第一个1右侧所有0变为1。再与原数做与操作,则右侧第一个1变为0。上述操作能运行几次,则说明原数中有多少个1.

### C++ 进制转换方法及代码示例 #### 使用字符串流 `stringstream` 实现进制转换 在 C++ 中,可以利用 `<sstream>` 库中的 `stringstream` 类来方便地完成不同进制之间的转换。下面是一个完整的例子,展示了如何将十进制数分别转换成二进制、八进制和十六进制。 ```cpp #include <iostream> #include <sstream> using namespace std; int main() { int decimal; cout << "请输入一个十进制整数:" << endl; cin >> decimal; stringstream ss; // 转换为二进制 ss.clear(); ss << dec << showbase << internal << bitset<32>(decimal); string binary = ss.str().substr(2); // 去掉前缀 '0b' cout << "二进制表示:" << binary << endl; // 转换为八进制 ss.clear(); ss << oct << decimal; cout << "八进制表示:" << ss.str() << endl; // 转换为十六进制 ss.clear(); ss << hex << uppercase << decimal; cout << "十六进制表示:" << ss.str() << endl; return 0; } ``` 这段代码首先定义了一个 `stringstream` 对象用于存储临时数据,在每次执行新的转换之前都调用了 `clear()` 方法重置其状态[^1]。 对于更复杂的场景比如从其他进制转回十进制,则可以通过读取输入并逐位处理的方式来实现: ```cpp #include <iostream> #include <cmath> using namespace std; // 将任意基数的字符串转化为十进制数值 long long convertToDecimal(const string& numStr, int base) { long long result = 0; for (size_t i = 0; i < numStr.size(); ++i){ char ch = tolower(numStr[numStr.size()-1-i]); int digitValue = isdigit(ch)?ch-'0':ch-'a'+10; if(digitValue >= base || digitValue < 0)return -1; result += pow(base,i)*digitValue; } return result; } int main(){ string inputNum; int base; cout<<"请输入要转化的数字及其对应的基底(如'1A 16' 表示16进制下的1A):"<<endl; cin>>inputNum>>base; cout<<convertToDecimal(inputNum,base)<<endl; return 0; } ``` 此函数接受两个参数——待转换的字符串形式的数字以及原始进制,并返回相应的十进制值。注意这里假设合法的字符集是从 `'0'~'9', 'a'~'f'` 或者大写的 `'A'~'F'` 。如果遇到非法字符则立即停止计算并返回错误标志 `-1` [^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值